Интерфейс внешних функций позволяет haskell работать с миром C. Теперь сторона Haskell позволяет работать с указателями, используя Storable
экземпляров. Так, например, если у меня есть массив целых чисел в мире C, вероятным представлением этого в мире haskell будет Ptr Int
. Теперь предположим, что я хочу перевести выражение C a[0] = a[0] + 1
. Единственный способ сделать это на стороне haskell - это заглянуть внутрь, а затем подсунуть результат добавления. В результате этого возникает проблема с этим подходом. (Я не уверен, что оптимизирующий компилятор всегда может избежать этого)Низкоуровневые указатели в haskell
Теперь большинство людей могут считать этот эффект безвредным, но подумайте о ситуации, когда объект указателя содержит некоторые конфиденциальные данные. Я создал этот указатель на стороне c так, чтобы он всегда гарантировал, что его содержимое никогда не будет выгружено из памяти (используя системный вызов mlock). Теперь просмотр результатов на стороне haskell больше не гарантирует безопасность конфиденциальных данных.
Итак, каким должен быть лучший способ избежать этого в мире haskell? Кто-то сталкивался с аналогичными проблемами с манипуляторами с низким уровнем указателя в haskell.
Можете ли вы пояснить, как обкатка вредно? Если вы имеете в виду, что кто-то может впоследствии сканировать диск, чтобы найти значение swapped, то то же самое можно сказать и о других вещах на стороне C. После того, как вы начнете использовать это «чувствительное значение», вы не можете предсказать, где он закончится - даже стек, локальные переменные, регистры в состоянии задачи, .... все могут перейти на диск. Я ожидал бы, что области памяти заблокированы по соображениям производительности - например, не заменяйте Java-кучу, потому что замена редко загружаемых страниц кучи может сделать GC медленным. –
Вы можете заблокировать память, используя системный вызов mlock. Так, например, если вы заблокируете вышеупомянутый массив, он никогда не будет заменен. libgcrypt, который используется такими программами, как gnupg, для блокировки конфиденциальной информации в памяти по соображениям безопасности. – Satvik
Поскольку я не могу заблокировать чистые значения haskell, поскольку они могут быть перемещены сборщиком мусора, я должен работать с защищенной памятью, выделенной на стороне c (используя ForeignPtr в моем случае). – Satvik