<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=utf-8">
<meta name="Generator" content="Microsoft Word 14 (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:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","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.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
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="SV" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hello!<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I agree it’s controversial. I would say that some people would like that and others don’t. In my humble opinion it should be ok to add this check
 to clang-tidy.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Possibly to avoid some spurious warnings you could warn for const pointers only. I personally think that parameters that are written should be
 passed by pointer “getvalue(&x)” is more explicit imho than “getvalue(x)”.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US">> 3 - Are there more check ideas waiting for someone to implement so I could pick up, learn more and actually contribute to the code base?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I don’t know if there is an official list anywhere.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">But I would assume there are many ideas.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Personally I would like that more types of UB is detected. Here is some testcode with various UB, Clang detects some of the UB but not all:<o:p></o:p></span></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" style="border-collapse:collapse">
<tbody>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">void</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">alias</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> x;
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> *ip=&x;
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">float</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> *fp = (</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">float</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
 *)ip; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">buffer_overflow</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> x[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">10</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">]={</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">0</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">};
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> x[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">100</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">];
 }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">dead_pointer</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">(</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
 a) { </span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> *p=&a;
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">if</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> (a) {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> x=</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">0</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">;
 p = &x; } </span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> *p; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">division_by_zero</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">100</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> /
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">0</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">float_to_int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">double</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> d=</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">1E100</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">;
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> (</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">)d;
 }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">void</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">negative_size</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">(</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
 sz) { </span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">if</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> (sz <
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">0</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">) {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> buf[sz]; } }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">no_return</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {}<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">null_pointer</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> *p =
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">0</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">;
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> *p; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> *</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">pointer_arithmetic</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">()
 { </span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">static</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> buf[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">10</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">];
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> buf +
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">100</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">unsigned</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">char</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">pointer_to_u8</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">static</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> buf[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">10</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">];
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> (</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">*)buf;
 }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">pointer_subtraction</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">char</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> a[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">10</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">];
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">char</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> b[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">10</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">];
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> b-a; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">pointer_comparison</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">char</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> a[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">10</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">];
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">char</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> b[</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">10</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">];
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> b<a; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">shift_overrun</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">(</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
 x) { </span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> x <<
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">123</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">shift_negative</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> -</span><span style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">1</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
 << </span><span style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">1</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">int_overflow</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> intmax = (~</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">0U</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">)
 >> </span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">1</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">;
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> intmax *
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">2</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span lang="EN-US" style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">void</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">string_literal</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() { *((</span><span style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">char</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
 *)</span><span style="font-size:10.5pt;font-family:"Courier New";color:#183691">"hello"</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">) =
</span><span style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">0</span><span style="font-size:10.5pt;font-family:"Courier New";color:#24292E">; }<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="1%" nowrap="" valign="top" style="width:1.0%;padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" align="right" style="text-align:right;line-height:15.0pt"><span style="font-size:9.0pt;font-family:Consolas;color:#24292E"><o:p> </o:p></span></p>
</td>
<td valign="top" style="padding:0in 7.5pt 0in 7.5pt">
<p class="MsoNormal" style="line-height:15.0pt"><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#795DA3">uninit</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">() {
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">int</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> x;
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#A71D5D">return</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E"> x +
</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#0086B3">2</span><span lang="EN-US" style="font-size:10.5pt;font-family:"Courier New";color:#24292E">; }<o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Best regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Daniel Marjamäki<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> cfe-dev [<a href="mailto:cfe-dev-bounces@lists.llvm.org">mailto:cfe-dev-bounces@lists.llvm.org</a>]
<b>On Behalf Of </b>Breno Guimarães via cfe-dev<br>
<b>Sent:</b> Thursday, March 16, 2017 5:55 AM<br>
<b>To:</b> <a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<b>Subject:</b> [cfe-dev] [clang-tidy] Check for paranoic code (pointer checking)<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hi all,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I started exploring clang-tidy to create checks for a large C++ code base we have at work, with many developers with C background doing C++.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">After doing the first tutorial on VirtualShadowingCheck, I wrote a check to detect paranoic code using pointers. By paranoic, I mean this:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">static void foo(T* p, ...) {<br>
    if (!p) return;<br>
    // do something<br>
}<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The method is doing the right thing to check the input, but the interface itself could've been written with a reference, thus delegating to the caller the responsability of doing the null check.<br>
<br>
This is not at all always possible, since this style can be valid for several reasons: pointers can refer diverse conceptual objects, e.g. arrays), the function could be virtual, thus forced to follow the same parameters, and so on.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">But still, controversial as it is, I ran this check on LLVM code base.<br>
<br>
llvm/tools/clang/lib/Sema/SemaLookup.cpp:3453 is one example. (the check finds over 15 violations, but I haven't analyzed them all)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">This function is one example that could be ignoring a potential mistake. The caller could expect a valid pointer in at least some of those calls. The convenience of writing:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">foo(something->getPointer(), ...);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">can stimulate the developer to not write checks/assertions for some cases that he/she expects the pointer to be valid.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">All that being said, I have some questions:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">1 - Is the community receptive to such controversial checks? Or is clang-tidy only interested in low false positive/ non controversial checks?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">2 - Any feedback on this specific check?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">3 - Are there more check ideas waiting for someone to implement so I could pick up, learn more and actually contribute to the code base?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Breno Rodrigues Guimarães<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>