<div dir="ltr">Dear cfe-dev,<div><br>I am testing out the alpha.deadcode.UnreachableCode checker and I have found an interesting case where it fails to find an unreachable block. Here is the minified version of the code:</div><div><br></div><div><div>void f()</div><div>{</div><div>  int *i = new int;</div><div>  if (!i) {</div><div>    return; // this code is unreachable ("new" throws an exception if not enough memory)</div><div>  }</div><div>  for (int j = 0; j < 4; ++j) {</div><div>  }</div><div>}</div></div><div><br></div><div>I'm running the analyzer with "clang -cc1  -analyze -analyzer-checker=alpha.deadcode.UnreachableCode f.cpp".</div><div><br></div><div>If I decrease the loop boundary as follows:</div><div><br></div><div><div>void f()</div><div>{</div><div>  int *i = new int;</div><div>  if (!i) {</div><div>    return;</div><div>  }</div><div>  for (int j = 0; j < 3; ++j) { // NOTE: changed 4 to 3</div><div>  }</div><div>}</div></div><div><br></div><div>then the CSA reports the unreachable code correctly:</div><div><br></div><div><div>f.cpp:5:5: warning: This statement is never executed</div><div>    return;</div><div>    ^~~~~~</div><div>1 warning generated.</div></div><div><br></div><div>I suspect that the problem is due to the default unrolling depth of loops during analysis, but I don't understand how exactly this unrolling interacts with the unreachable code checker.</div><div><br></div><div>Could anyone confirm if this is the expected behavior (known limitation) of the checker or if this is a bug?<br><br>Best,<br>Stefan</div><div><br></div></div>