<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 16px; font-family: Calibri, sans-serif;">
<div>Hi everyone,</div>
<div><br>
</div>
<div>The clang static analyzer gives a false positive warning on the following program:</div>
<div><br>
</div>
<div style="font-family: -webkit-standard;">
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;">
<div><font face="Consolas" style="font-size: 14px;">$ cat falseLeak.cpp </font></div>
<div><font face="Consolas" style="font-size: 14px;">struct CtrlBlk {</font></div>
<div><font face="Consolas" style="font-size: 14px;">    explicit CtrlBlk() : m_useCount(1) {}</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">    virtual void dispose();</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">    void decUseCount() {</font></div>
<div><font face="Consolas" style="font-size: 14px;">        -- m_useCount;</font></div>
<div><font face="Consolas" style="font-size: 14px;">        if (m_useCount == 0) { dispose(); }</font></div>
<div><font face="Consolas" style="font-size: 14px;">    }</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">    int m_useCount;</font></div>
<div><font face="Consolas" style="font-size: 14px;">};</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">struct Ptr {</font></div>
<div><font face="Consolas" style="font-size: 14px;">    Ptr() { m_cntrlBlk = new CtrlBlk; }</font></div>
<div><font face="Consolas" style="font-size: 14px;">    ~Ptr() { m_cntrlBlk->decUseCount(); }</font></div>
<div><font face="Consolas" style="font-size: 14px;">    CtrlBlk* m_cntrlBlk;</font></div>
<div><font face="Consolas" style="font-size: 14px;">};</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">void testCase() { Ptr px; }</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">$ clang-tidy -checks=* falseLeak.cpp </font></div>
<div><font face="Consolas" style="font-size: 14px;">1 warning generated.</font></div>
<div><font face="Consolas" style="font-size: 14px;">/Users/benoit/tmp/falseLeak.cpp:20:27: warning: Potential leak of memory pointed to by 'px.m_cntrlBlk' [clang-analyzer-cplusplus.NewDeleteLeaks]</font></div>
<div><font face="Consolas" style="font-size: 14px;">void testCase() { Ptr px; }</font></div>
<div><font face="Consolas" style="font-size: 14px;">                          ^</font></div>
<div><font face="Consolas" style="font-size: 14px;">/Users/benoit/tmp/falseLeak.cpp:20:23: note: Calling default constructor for 'Ptr'</font></div>
<div><font face="Consolas" style="font-size: 14px;">void testCase() { Ptr px; }</font></div>
<div><font face="Consolas" style="font-size: 14px;">                      ^</font></div>
<div><font face="Consolas" style="font-size: 14px;">/Users/benoit/tmp/falseLeak.cpp:15:26: note: Memory is allocated</font></div>
<div><font face="Consolas" style="font-size: 14px;">    Ptr() { m_cntrlBlk = new CtrlBlk; }</font></div>
<div><font face="Consolas" style="font-size: 14px;">                         ^</font></div>
<div><font face="Consolas" style="font-size: 14px;">/Users/benoit/tmp/falseLeak.cpp:20:23: note: Returning from default constructor for 'Ptr'</font></div>
<div><font face="Consolas" style="font-size: 14px;">void testCase() { Ptr px; }</font></div>
<div><font face="Consolas" style="font-size: 14px;">                      ^</font></div>
<div><font face="Consolas" style="font-size: 14px;">/Users/benoit/tmp/falseLeak.cpp:20:27: note: Potential leak of memory pointed to by 'px.m_cntrlBlk'</font></div>
<div><font face="Consolas" style="font-size: 14px;">void testCase() { Ptr px; }</font></div>
<div><font face="Consolas" style="font-size: 14px;">                          ^</font></div>
</blockquote>
<div style="font-family: Calibri, sans-serif;"><br>
</div>
</div>
<div>Here’s my solution to silence up that false positive:</div>
<div><br>
</div>
<div style="font-family: -webkit-standard;">
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;">
<div><font face="Consolas" style="font-size: 14px;">#ifdef __clang_analyzer__</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// \brief Escape a variable from the analysis of the clang static analyzer</font></div>
<div><font face="Consolas" style="font-size: 14px;">    ///</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// This function takes a reference to a variable as an argument. This</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// causes the static analyzer tool to notice that the variable has escape</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// the scope of its analysis. It forces the static analyzer to make very</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// conservative assumptions about the state of the variable. This also</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// includes assumptions about any memory location referenced by this</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// variable.</font></div>
<div><font face="Consolas" style="font-size: 14px;">    ///</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// This can be used to silence up false positives. In general, it is</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// better to augment the information available to the static analyzer</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// using attributes and/or assertions. Unfortunately, this isn't always</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// possible. For example, it might be impossible to describe that a given</font></div>
<div><font face="Consolas" style="font-size: 14px;">    /// object is destructed along all execution paths.</font></div>
<div><font face="Consolas" style="font-size: 14px;">    template <typename V> static void escapeFromClangStaticAnalysis(V& escapedVar);</font></div>
<div><font face="Consolas" style="font-size: 14px;">#endif</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">struct CtrlBlk {</font></div>
<div><font face="Consolas" style="font-size: 14px;">    explicit CtrlBlk() : m_useCount(1) {}</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">    virtual void dispose();</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">    void decUseCount() {</font></div>
<div><font face="Consolas" style="font-size: 14px;">        -- m_useCount;</font></div>
<div><font face="Consolas" style="font-size: 14px;">        if (m_useCount == 0) { dispose(); }</font></div>
<div><font face="Consolas" style="font-size: 14px;">#ifdef __clang_analyzer__</font></div>
<div><font face="Consolas" style="font-size: 14px;">        escapeFromClangStaticAnalysis(m_useCount);</font></div>
<div><font face="Consolas" style="font-size: 14px;">#endif</font></div>
<div><font face="Consolas" style="font-size: 14px;">    }</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">    int m_useCount;</font></div>
<div><font face="Consolas" style="font-size: 14px;">};</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">struct Ptr {</font></div>
<div><font face="Consolas" style="font-size: 14px;">    Ptr() { m_cntrlBlk = new CtrlBlk; }</font></div>
<div><font face="Consolas" style="font-size: 14px;">    ~Ptr() { m_cntrlBlk->decUseCount(); }</font></div>
<div><font face="Consolas" style="font-size: 14px;">    CtrlBlk* m_cntrlBlk;</font></div>
<div><font face="Consolas" style="font-size: 14px;">};</font></div>
<div><font face="Consolas" style="font-size: 14px;"><br>
</font></div>
<div><font face="Consolas" style="font-size: 14px;">void testCase() { Ptr px; }</font></div>
</blockquote>
</div>
<div><br>
</div>
<div>Would anyone have a better solution ?</div>
<div><br>
</div>
<div>Thanks,</div>
<div>Benoit</div>
<div><br>
</div>
<div>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><b><span style="font-size: 9pt; font-family: Arial, sans-serif; color: rgb(99, 99, 99);">Benoit Belley</span></b><span style="font-size: 9pt;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">Sr Principal Developer</span><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">M&E-Product Development Group</span><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><b><span style="font-size: 7pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">MAIN</span></b><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);"> +1
 514 393 1616</span><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><b><span style="font-size: 7pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">DIRECT</span></b><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);"> +1
 438 448 6304</span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><b><span style="font-size: 7pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">FAX</span></b><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);"> +1
 514 393 0110</span><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><a href="http://twitter.com/autodesk" style="color: purple;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">Twitter</span></a><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><a href="https://www.facebook.com/Autodesk" style="color: purple;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">Facebook</span></a><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><b><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">Autodesk, Inc.</span></b><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">10 Duke Street</span><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">Montreal, Quebec, Canada H3C 2L7</span><span style="font-size: 7.5pt; font-family: Arial, sans-serif;"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><a href="http://www.autodesk.com/" style="color: purple;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);">www.autodesk.com</span></a><span style="color: rgb(146, 147, 150);"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><span style="font-size: 7.5pt; font-family: Arial, sans-serif; color: rgb(146, 147, 150);"> </span></p>
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt;"><img border="0" width="283" height="41" id="Picture_x0020_1" src="cid:54EDE081-2F3C-43D7-BADB-AD33454CAA10" alt="Description: Email_Signature_Logobar" type="image/png"><o:p></o:p></p>
<div style="font-family: Calibri; font-size: medium;">
<p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif;">
<span style="font-size: 11.5pt;"> </span></p>
</div>
</div>
</body>
</html>