haskell中的低级别指针

时间:2013-08-24 12:30:35

标签: pointers haskell ffi

外部函数接口允许haskell与C世界一起工作。现在,Haskell端允许使用Storable实例处理指针。因此,例如,如果我在C世界中有一个整数数组,那么在haskell世界中这个整数的合理表示将是Ptr Int。现在假设我要翻译C表达式a[0] = a[0] + 1。在haskell方面做到这一点的唯一方法是窥视,然后回顾添加的结果。这种方法的问题是由此产生临时值。 (我不确定优化编译器总是可以避免这样做)

现在大多数人可能认为这种影响是无害的,但想想指针对象包含一些敏感数据的情况。我已经在c方面创建了这个指针,它总是保证它的内容永远不会被换出内存(使用mlock系统调用)。现在,在haskell端查看结果不再能保证敏感数据的安全性。

那么在haskell世界中应该避免这种情况的最佳方法是什么?在haskell中有没有其他人遇到过与低级指针操作相似的问题。

1 个答案:

答案 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)

所有这一切都说,我承认我不清楚你关心的是什么,所以我可能错过了你的观点,这样做是为了解决错误的事情。