<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
          "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>FAQ and How to Deal with Common False Positives</title>
  <link type="text/css" rel="stylesheet" href="menu.css">
  <link type="text/css" rel="stylesheet" href="content.css">
  <script type="text/javascript" src="scripts/menu.js"></script>
  <style type="text/css">
    tr:first-child { width:20%; }
  </style>
</head>
<body>

<div id="page">
<!--#include virtual="menu.html.incl"-->

<div id="content">

<h1>FAQ and How to Deal with Common False Positives</h1>

<ol>
  <li><a href="#custom_assert">How do I tell the analyzer that I do not want the bug being
reported here since my custom error handler will safely end the execution before
the bug is reached?</a></li>
  <li><a href="#null_pointer">The analyzer reports a null dereference, but I know that the
pointer is never null. How can I tell the analyzer that a pointer can never be
null?</a></li>
  <li><a href="#use_assert">The analyzer assumes that a loop body is never entered.  How can I tell it that the loop body will be entered at least once?</a></li>
  <li><a href="#suppress_issue">How can I suppress a specific analyzer warning?</a></li>
</ol>


<h4 id="custom_assert" class="faq">Q: How do I tell the analyzer that I do not want the bug being
reported here since my custom error handler will safely end the execution before
the bug is reached?</h4>

<img src="images/example_custom_assert.png" alt="example custom assert">

<p>You can tell the analyzer that this path is unreachable by teaching it about your <a href = "annotations.html#custom_assertions" >custom assertion handlers</a>. For example, you can modify the code segment as following.</p>

<pre class="code_example">
void customAssert() <span class="code_highlight">__attribute__((analyzer_noreturn))</span>;
int foo(int *b) {
  if (!b)
    customAssert();
  return *b;
}</pre>


<h4 id="null_pointer" class="faq">Q: The analyzer reports a null dereference, but I know that the
pointer is never null. How can I tell the analyzer that a pointer can never be
null?</h4>

<img src="images/example_null_pointer.png" alt="example null pointer">

<p>The reason the analyzer often thinks that a pointer can be null is because the preceding code checked compared it against null. So if you are absolutely sure that it cannot be null, remove the preceding check and, preferably, add an assertion as well. For example, in the code segment above, it will be sufficient to remove the <tt>if (!b)</tt> check. </p>

<pre class="code_example">
void usePointer(int *b);
int foo(int *b) {
  usePointer(b);
  return *b;
}</pre>

<h4 id="use_assert" class="faq">Q: The analyzer assumes that a loop body is never entered.  How can I tell it that the loop body will be entered at least once?</h4>

<img src="images/example_use_assert.png" alt="example use assert">

<p>You can teach the analyzer facts about your code as well as document it by
using assertions. In the contrived example above, the analyzer reports an error
on the path which assumes that the loop is never entered. However, the owner of
the code might know that the loop is always entered because the input parameter
<tt>length</tt> is always greater than <tt>0</tt>. The false positive can be
suppressed by asserting this knowledge, adding <tt>assert(length > 0)</tt> in
the beginning of the function.</p>

<pre class="code_example">
int foo(int length) {
  int x = 0;
  <span class="code_highlight">assert(length > 0);</span>
  for (int i = 0; i < length; i++)
    x += 1;
  return length/x;
}
</pre>

<h4 id="suppress_issue" class="faq">Q: How can I suppress a specific analyzer warning?</h4>

<p>There is currently no mechanism for suppressing the analyzer warning,
although this is currently being investigated. If you encounter an analyzer
bug/false positive, please <a href = "filing_bugs.html">report it</a>.</p>

</div>
</div>
</body>
</html>

