<div dir="ltr"><div><br></div>As a continuation of D17688 (add MSVC variants of strdup to leak checks), I'm going to add a bunch of other Microsoft functions to the static analyzer. I'm also going to add tempnam, a cstdlib function that returns a pointer to memory that must be manually freed.<div><br></div><div>What other functions should I add?<div><br></div><div><br></div><div>Currently, I'm going to add:</div><div><ul><li><font face="monospace, monospace">_free_dbg</font></li><li><font face="monospace, monospace">_malloc_dbg</font></li><li><font face="monospace, monospace">_realloc_dbg</font></li><li><font face="monospace, monospace">_recalloc_dbg</font></li><li><font face="monospace, monospace">_calloc_dbg</font></li><li><font face="monospace, monospace">_strdup_dbg</font></li><li><font face="monospace, monospace">_wcsdup_dbg</font></li><li><font face="monospace, monospace">_mbsdup</font></li><li><font face="monospace, monospace">_mbsdup_dbg</font></li><li><font face="monospace, monospace">tempnam</font></li><li><font face="monospace, monospace">_tempnam</font></li><li><font face="monospace, monospace">_tempnam_dbg</font></li><li><font face="monospace, monospace">_wtempnam</font></li><li><font face="monospace, monospace">_wtempnam_dbg</font></li></ul><div><br></div><div>A bunch of other functions that I'd like to add, but are non-trivial to add, so I'll hold off on them for now:</div><div><ul><li>Aligned functions (I think that you're not supposed to mix them with their non-aligned variants)</li><ul><li><font face="monospace, monospace">_aligned_free</font></li><li><font face="monospace, monospace">_aligned_free_dbg</font></li><li><font face="monospace, monospace">_aligned_malloc</font></li><li><font face="monospace, monospace">_aligned_malloc_dbg</font></li><li><font face="monospace, monospace">_aligned_msize</font></li><li><font face="monospace, monospace">_aligned_msize_dbg</font></li><li><font face="monospace, monospace">_aligned_offset_malloc</font></li><li><font face="monospace, monospace">_aligned_offset_malloc_dbg</font></li><li><font face="monospace, monospace">_aligned_offset_realloc</font></li><li><font face="monospace, monospace">_aligned_offset_realloc_dbg</font></li><li><font face="monospace, monospace">_aligned_offset_recalloc</font></li><li><font face="monospace, monospace">_aligned_offset_recalloc_dbg</font></li><li><font face="monospace, monospace">_aligned_realloc</font></li><li><font face="monospace, monospace">_aligned_realloc_dbg</font></li><li><font face="monospace, monospace">_aligned_recalloc</font></li><li><font face="monospace, monospace">_aligned_recalloc_dbg</font></li></ul><li>Functions that should be freed with a function other than free:</li><ul><li><font face="monospace, monospace">_free_locale</font></li><ul><li><font face="monospace, monospace">_create_locale</font></li><li><font face="monospace, monospace">_wcreate_locale</font></li></ul></ul><li>Functions that only return dynamically allocated memory in certain conditions:</li><ul><li><font face="monospace, monospace">getcwd</font></li><li><font face="monospace, monospace">_getcwd</font></li><li><font face="monospace, monospace">_getcwd_dbg</font></li><li><font face="monospace, monospace">_wgetcwd</font></li><li><font face="monospace, monospace">_wgetcwd_dbg</font></li><li><font face="monospace, monospace">_getdcwd</font></li><li><font face="monospace, monospace">_getdcwd_dbg</font></li><li><font face="monospace, monospace">_wgetdcwd</font></li><li><font face="monospace, monospace">_wgetdcwd_dbg</font></li><li><font face="monospace, monospace">realpath</font></li><li><font face="monospace, monospace">_fullpath</font></li><li><font face="monospace, monospace">_fullpath_dbg</font></li><li><font face="monospace, monospace">_wfullpath</font></li><li><font face="monospace, monospace">_wfullpath_dbg</font></li></ul><li>Functions that return dynamically allocated memory via an "_Out_" parameter*:</li><ul><li><font face="monospace, monospace">_dupenv_s</font></li><li><font face="monospace, monospace">_dupenv_s_dbg</font></li><li><font face="monospace, monospace">_wdupenv_s</font></li><li><font face="monospace, monospace">_wdupenv_s_dbg</font></li></ul><li>Functions which <i>may</i> allocate stack <u><i><b>or</b></i></u> heap:</li><ul><li><font face="monospace, monospace"><a href="https://msdn.microsoft.com/en-us/library/5471dc8s.aspx">_malloca</a> </font>(must be freed with <a href="https://msdn.microsoft.com/en-us/library/k8984a8h.aspx"><font face="monospace, monospace">_freea</font></a>)<br></li></ul><li>Functions that return non-freeable memory, if passed NULL, but look like users should free them. These two are very weird, and therefore it might be very useful to check:</li><ul><li><font face="monospace, monospace"><a href="http://en.cppreference.com/w/cpp/io/c/tmpnam">tmpnam</a><br></font></li><li><font face="monospace, monospace"><a href="https://msdn.microsoft.com/en-us/library/hs3e7355.aspx">_wtmpnam</a><br></font></li></ul></ul></div></div><div><div><div><br></div><div>*for the SAL obsessed (like me) it's actually "<font face="monospace, monospace">_Outptr_result_buffer_maybenull_(*_BufferCount) _Outptr_result_maybenull_z_</font>".</div><div><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><span style="font-size:12.8px">Sincerely,</span><br style="font-size:12.8px"><span style="font-size:12.8px">Alexander Riccio</span><br style="font-size:12.8px"><span style="font-size:12.8px">--</span><br style="font-size:12.8px"><span style="font-size:12.8px">"Change the world or go home."</span><div style="font-size:12.8px"><a href="http://about.me/ariccio" target="_blank">about.me/ariccio</a></div><div style="font-size:12.8px"><a href="http://about.me/ariccio" target="_blank"><br></a></div><div style="font-size:12.8px">If left to my own devices, I will build more.</div><div style="font-size:12.8px">⁂</div></div></div></div></div></div>
</div></div></div></div></div>