
Hi,
instance Storable SignedMessage where sizeOf (SignedMessage{messageLength}) = sizeOf (undefined :: CSize) + fromIntegral messageLength + sizeOf cryptoSignBytes
Your sizeOf function mustn't evaluate its argument, yet it does. The size of the storable data must only be defined by its type so you can't use messageLength here. sizeOf would better be defined as sizeOf :: Proxy a -> Word. For now it's just a convention to ignore the first argument. Sylvain On 28/11/2022 17:04, Hécate wrote:
Hi everyone,
In a fit of madness I have found myself writing Haskell code where I need to implement a Storable instance. However, by virtue of not being a C programmer, I'm fairly lost on some of the details, especially the value of the sizeOf and alignment methods.
My Haskell-level record is the following:
data SignedMessage = SignedMessage { messageLength :: CSize , messageForeignPtr :: ForeignPtr CUChar , signatureForeignPtr :: ForeignPtr CUChar }
Here is the code of the Storable instance: https://gist.github.com/Kleidukos/31346d067f309f2a86cbd97a85c0f1e8#file-sign...
And so I used `hedgehog-classes` to test the Storable instance. However, all the tests fail with the same reason: Prelude.undefined:
https://gist.github.com/Kleidukos/31346d067f309f2a86cbd97a85c0f1e8#file-unde...
The main problem (and that's certainly a red herring for me) is that the `undefined` call comes frombase:Foreign.Marshal.Array. Which shouldn't be a problem, as it is not supposed to be evaluated! Yet apparently it is.
If you're interested to see the full code, it's located here: https://github.com/haskell-cryptography/libsodium-bindings/blob/add-sel-pack...
I'm not sure how to proceed from here. What would be a good angle to approach this?
Cheers, Hécate