reallyUnsafePtrEquality#在没有字段的构造函数上

jbe*_*man 9 haskell ghc

我的理解是,没有字段的类型的构造函数是"静态分配"的,GHC 在所有用途之间共享这些构造函数,并且GC不会移动它们.

如果这是正确的,那么我希望使用reallyUnsafePtrEquality#on值FalseNothing非常安全(没有错误否定或肯定),因为它们只能表示为与该构造函数的单个实例相同的指针.

我的推理是否正确?是否有任何潜在的问题或理由怀疑在不久的将来版本的GHC中这可能会变得不安全?

Dan*_*zer 12

我实际上设法reallyUnsafePtrEquality做错了.

这是我的最小代码示例

{-# LANGUAGE MagicHash #-}
import GHC.Prim

-- Package it up nicely
ptrCmp :: a -> a -> Bool
ptrCmp a b = case (reallyUnsafePtrEquality# a b) of
  0# -> False
  1# -> True

main = do
  b <- readLn
  let a  = if b then Nothing else Just ()
      a' = Nothing
  print $ a == a'     -- Normal
  print $ ptrCmp a a' -- Evil
Run Code Online (Sandbox Code Playgroud)

并做一些类似的事情

 $ ghc --version
   The Glorious Glasgow Haskell Compilation System, version 7.8.2
 $ ghc unsafe.hs
 $ ./unsafe
   True
   True
   False
Run Code Online (Sandbox Code Playgroud)

所以......是的,reallyUnsafePtrEquality仍然是邪恶的.