[Haskell-cafe] Writing and testing a Storable instance for a record wrapping ForeignPtrs

Sylvain Henry sylvain at haskus.fr
Mon Nov 28 16:14:24 UTC 2022


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-signing-hs
>
> 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-undefined_error-txt 
>
>
> 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-package/sel/src/Sel/Signing.hs
>
> I'm not sure how to proceed from here. What would be a good angle to 
> approach this?
>
> Cheers,
> Hécate
>


More information about the Haskell-Cafe mailing list