外部函数接口允许haskell与C世界一起工作。现在,Haskell端允许使用Storable
实例处理指针。因此,例如,如果我在C世界中有一个整数数组,那么在haskell世界中这个整数的合理表示将是Ptr Int
。现在假设我要翻译C表达式a[0] = a[0] + 1
。在haskell方面做到这一点的唯一方法是窥视,然后回顾添加的结果。这种方法的问题是由此产生临时值。 (我不确定优化编译器总是可以避免这样做)
现在大多数人可能认为这种影响是无害的,但想想指针对象包含一些敏感数据的情况。我已经在c方面创建了这个指针,它总是保证它的内容永远不会被换出内存(使用mlock系统调用)。现在,在haskell端查看结果不再能保证敏感数据的安全性。
那么在haskell世界中应该避免这种情况的最佳方法是什么?在haskell中有没有其他人遇到过与低级指针操作相似的问题。
答案 0 :(得分:3)
我刚用代码构建了一个测试用例:
foo :: Ptr CInt -> IO ()
foo p = peek p >>= poke p ∘ (+1)
使用GHC 7.6.3 -fllvm -O2 -ddump-asm
我看到相关说明:
0x0000000000000061 <+33>: mov 0x7(%r14),%rax
0x0000000000000065 <+37>: incl (%rax)
因此它将地址加载到rax
并增加该地址的内存。似乎是你用其他语言得到的,但让我们看看。
对于C,我认为公平比较是:
void foo(int *p)
{
p[0]++;
}
结果是:
0x0000000000000000 <+0>: addl $0x1,(%rdi)
所有这一切都说,我承认我不清楚你关心的是什么,所以我可能错过了你的观点,这样做是为了解决错误的事情。