<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"Viner Hand ITC";
        panose-1:3 7 5 2 3 5 2 2 2 3;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.CodeBlock, li.CodeBlock, div.CodeBlock
        {mso-style-name:"Code Block";
        margin:0in;
        margin-bottom:.0001pt;
        background:#F2F2F2;
        border:none;
        padding:0in;
        font-size:11.0pt;
        font-family:Consolas;}
p.MailQuote, li.MailQuote, div.MailQuote
        {mso-style-name:"Mail Quote";
        margin:0in;
        margin-bottom:.0001pt;
        border:none;
        padding:0in;
        font-size:9.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle19
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">We have some very old code that resembles the following that causes it to crash when compiled with clang (it “works” with gcc).  The problem is the dereference of ‘p’ in the constructor argument of fooLI below (line marked as [2]).  Due
 to this dereference, the constructor FooLI(const Foo<T>& foo) is invoked which in turn invokes FooBI(…). Since p has already been dereferenced, clang assumes that p is non-null (which is OK because well-formed C++ code would not dereference a NULL pointer).
 Clang therefore eliminates the null check on foo_ at line [1] assuming that it always non-NULL. So when a null pointer is returned by getFooL(), a crash occurs.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="mso-element:para-border-div;border-top:solid #1F497D 1.0pt;border-left:none;border-bottom:solid #1F497D 1.0pt;border-right:none;padding:1.0pt 0in 1.0pt 0in;background:#F2F2F2">
<p class="CodeBlock">class FooBI {<o:p></o:p></p>
<p class="CodeBlock" style="background:#F2F2F2">    FooBI(const FooB* foo_) :<o:p></o:p></p>
<p class="CodeBlock" style="background:#F2F2F2">        foo(foo_ && foo_->bar ? foo_ : NULL) {}   // [1]<o:p></o:p></p>
<p class="CodeBlock">    :<o:p></o:p></p>
<p class="CodeBlock">};<o:p></o:p></p>
<p class="CodeBlock">template<class T>class FooLI : public class FooBI {<o:p></o:p></p>
<p class="CodeBlock">    :    <o:p></o:p></p>
<p class="CodeBlock" style="background:#F2F2F2">    FooLI(const FooL<T>* foo) :<o:p></o:p></p>
<p class="CodeBlock">        FooBI(foo)<o:p></o:p></p>
<p class="CodeBlock">    {}<o:p></o:p></p>
<p class="CodeBlock">    FooLI(const Foo<T>& foo) :<o:p></o:p></p>
<p class="CodeBlock">        FooBI(&foo)<o:p></o:p></p>
<p class="CodeBlock">    {}<o:p></o:p></p>
<p class="CodeBlock">    :<o:p></o:p></p>
<p class="CodeBlock">};<o:p></o:p></p>
</div>
<p class="MsoNormal">:<o:p></o:p></p>
<div style="mso-element:para-border-div;border-top:solid #1F497D 1.0pt;border-left:none;border-bottom:solid #1F497D 1.0pt;border-right:none;padding:1.0pt 0in 1.0pt 0in;background:#F2F2F2">
<p class="CodeBlock">    FooL<Boo>* p = getFooL(); <o:p></o:p></p>
<p class="CodeBlock" style="background:#F2F2F2">    FooLI fooLI = FooLI(*p); // [2] p can be sometimes NULL
<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The fix for this problem in our code is to avoid the dereference on line [2] which will then invoke FooLI(const FooL<T>* foo) and the null check on line [1] will be retained. Is it possible for clang to generate a warning about this? -Wundefined-bool-conversion
 does generate warnings in similar situations but not specifically for this case. Perhaps, this should be a different warning. There are two choices of constructors, one accepting a pointer and another accepting a reference. When then pointer is then dereferenced
 and converted to a reference, do you think it merits a warning?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-align:justify"><i><span style="font-family:"Viner Hand ITC";color:black">-Riyaz<o:p></o:p></span></i></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>