I was reading up on the documentation for alloca and friends[1], which says, &quot;<span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; ">If any of the allocation functions fails, a value of <code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: monospace; line-height: 16px; "><a href="http://www.haskell.org/ghc/docs/7.0.2/html/libraries/base-4.3.1.0/Foreign-Ptr.html#v:nullPtr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(196, 69, 29); ">nullPtr</a></code> is produced.&quot;</span><div>
<span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><br></span></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; ">It seems like every example of FFI code that I find which uses alloca ignores the possibility of a nullPtr[2, 3, 4].</span></div>
<div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><br></span></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; ">So then I started trying out examples with the help of dmwit and others from #haskell.</span></div>
<div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><br></span></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; ">It seems that actually, alloca and friends throw exceptions:</span></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;">dmwit&gt; main = allocaArray (2^30) (\ptr -&gt; print ((nullPtr :: Ptr Double) == ptr))</span></font></div><div>
<span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><div>&lt;dmwit&gt; lispy: alloca also throws an exception.</div><div>&lt;dmwit&gt; lispy: Or rather, allocaBytes throws an exception, and alloca is implemented in terms of allocaBytes, so I&#39;m *guessing* that alloca throws an exception.</div>
</span></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><br></span></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; ">I&#39;m on a 64bit version of windows here with more than 4GB of memory to spare for the GHC process. Unfortunately, allocaBytes takes an Int so I can&#39;t test it with a request larger than the amount of physical ram I have.</span></div>
<div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><br></span></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; ">Just playing around with different arguments to allocaBytes I can get different behavior:</span></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;"> &lt;= 2^30 bytes, works perfectly</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;"> == 2^30 + 2^20 bytes, I get an &quot;&lt;interactive&gt;: out of memory&quot; message and ghci terminates</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;"> == 2^31-1, I get a crash where windows pops up a little dialog saying my program (ghci) has crashed.</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;"><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;">The behavior seems to be inconsistent with the documentation.</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;"><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;">What is the correct behavior for alloca and friends and should I be checking for nullPtr?</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;"><br></span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;">Thanks,</span></font></div>
<div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;">Jason </span></font></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><br>
</span></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 11px; "><br></span></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 11px;">[1] </span></font><a href="http://www.haskell.org/ghc/docs/7.0.2/html/libraries/base-4.3.1.0/Foreign-Marshal-Alloc.html">http://www.haskell.org/ghc/docs/7.0.2/html/libraries/base-4.3.1.0/Foreign-Marshal-Alloc.html</a></div>
<div>[2] <a href="http://en.wikibooks.org/wiki/Haskell/FFI">http://en.wikibooks.org/wiki/Haskell/FFI</a></div><div>[3] <a href="http://www.haskell.org/haskellwiki/HSFFIG/Examples">http://www.haskell.org/haskellwiki/HSFFIG/Examples</a></div>
<div>[4] <a href="http://book.realworldhaskell.org/read/interfacing-with-c-the-ffi.html">http://book.realworldhaskell.org/read/interfacing-with-c-the-ffi.html</a></div>