L'interface de fonction étrangère permet au haskell de fonctionner avec le monde C. Maintenant, côté Haskell permet de travailler avec les pointeurs en utilisant Storable
instances. Par exemple, si j'ai un tableau d'entiers dans le monde C, une représentation plausible de cela dans le monde de haskell serait Ptr Int
. Supposons maintenant que je souhaite traduire l'expression C a[0] = a[0] + 1
. La seule façon de faire cela du côté du haskell est de jeter un coup d'œil sur le résultat et de remonter le résultat de l'addition. Le problème avec cette approche est qu'une valeur temporaire est créée à la suite de cela. (Je ne suis pas sûr qu'un compilateur d'optimisation puisse toujours éviter cela)Pointeurs de bas niveau dans le haskell
Maintenant, la plupart des gens peuvent penser que cet effet est inoffensif, mais pensez à une situation où l'objet Pointer contient des données sensibles. J'ai créé ce pointeur sur le côté c de manière à toujours garantir que son contenu ne sera jamais transféré de la mémoire (en utilisant l'appel système mlock). Maintenant, jeter un coup d'œil sur le résultat du côté haskell ne garantit plus la sécurité des données sensibles.
Alors, quel devrait être le meilleur moyen d'éviter cela dans le monde du haskell? Est-ce que quelqu'un d'autre a rencontré des problèmes similaires avec des manipulations de bas niveau de pointeur dans haskell.
Pouvez-vous préciser en quoi l'échange est nocif? Si vous voulez dire que quelqu'un peut ensuite scanner le disque pour trouver la valeur permutée, alors la même chose peut être dite à propos d'autres choses du côté C. Une fois que vous commencez à utiliser cette "valeur sensible", vous ne pouvez pas prédire où elle finira - même la pile, les variables locales, les registres dans l'état de la tâche, .... peuvent tous se déplacer sur le disque. Je m'attendrais à ce que les régions de mémoire soient verrouillées pour des raisons de performance - par exemple, n'échangez pas Java Heap, car l'échange de pages de tas rarement accédées peut ralentir GC. –
Vous pouvez verrouiller une mémoire en utilisant l'appel système mlock. Ainsi, par exemple, si vous verrouillez le tableau ci-dessus, il est garanti qu'il ne sera jamais échangé. libgcrypt qui est utilisé par des programmes comme gnupg l'utilise pour verrouiller des informations sensibles dans la mémoire pour des raisons de sécurité. – Satvik
Comme je ne peux pas verrouiller les valeurs de haskell pur car elles peuvent être déplacées par le garbage collector, je dois travailler avec la mémoire sécurisée allouée du côté c (en utilisant ForeignPtr dans mon cas). – Satvik