<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Hello Matthew,<br>
      <br>
      It seems like the problem here is that you emit a report at the
      node generated on function end so it is considered as a bug place.
      There are two ways of solving this problem depending on what you
      need.<br>
      1. You don't want to show the path from the call to the end of
      function. In this case, you can create a non-fatal error node at
      function call and emit a report with this node. You can store this
      node in your state or retrieve it via walking up the path in the
      exploded graph when emitting the report in function's end. <br>
      2. If the function's end is the place you want to show, you can
      generate a diagnostic at the place where call happened using a
      BugReporterVisitor. There are some examples in different checkers
      (in MallocChecker, for example).<br>
      <br>
      <br>
      03.07.2017 08:48, Matthew Del Buono via cfe-dev пишет:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAEyi6Vd4MONKGmp-imgEZtuGaXMdtj7rUfB8HTOnKcBzdVhmvw@mail.gmail.com">
      <div dir="ltr">Hi all,
        <div><br>
        </div>
        <div>I'm working on a checker rule which is functioning well,
          but the bug reports it emits are quite problematic. Instead of
          reporting the source location that is interesting to the
          developer, it reports a very different location.</div>
        <div><br>
        </div>
        <div>Through my testing I've identified that my problem comes
          down to my need to emit the report late. I catch the potential
          trouble early, but I need to keep exploring to ensure that the
          problem exists before I can emit the bug report. As such, I
          don't generate the error node until later in the analysis. I
          hold onto the relevant SourceRange object at the time of
          detection so that I can reference it later in the report, but
          it doesn't seem to be doing much of anything.</div>
        <div><br>
        </div>
        <div>I'm using code like the following to emit my report:</div>
        <div><br>
        </div>
        <div>
          <div>            clang::ento::ExplodedNode *error =
            C.generateNonFatalErrorNode();</div>
          <div>            if (error == nullptr) {</div>
          <div>                return;</div>
          <div>            }</div>
          <div><br>
          </div>
          <div>            auto report =
            llvm::make_unique<clang::ento::BugReport>(*bugType,
            text, error);</div>
          <div>            report->addRange(sourceRange);</div>
          <div>            C.emitReport(std::move(report));</div>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>I've confirmed that "sourceRange" is, in fact, the desired
          range (and is valid), via its dump() function. Yet in my test
          case, while the sourceRange states <a class="moz-txt-link-rfc2396E" href="file:6:4-file:6:13">"file:6:4 - file:6:13"</a>, I
          end up getting a report on the next line (which is not
          interesting to the developer). I've noticed that if I emit my
          report immediately, rather than holding the source range for
          later, the emitted report is correct.</div>
        <div><br>
        </div>
        <div>Is there anything special I need to do here? Or what am I
          doing wrong when emitting my reports such that clang is
          refusing to reference my supplied source range?</div>
        <div><br>
        </div>
        <div>For reference, I tried to boil my checker down to a
          minimalist case that reproduces my trouble (attached). I mark
          the source range during the call to checkPostCall and then
          later emit all captured ranges during checkEndFunction. (Note
          that I'm not actually using check::EndFunction in my checker;
          it was just the easiest way to reproduce this.) The test file
          I'm running this checker against follows, from which I expect
          two reports, both on line 6, but I end up getting a single
          report marking the '}' on line 7 instead:</div>
        <div><br>
        </div>
        <div>
          <div>int foo();</div>
          <div>void bar(int);</div>
          <div><br>
          </div>
          <div>void baz()</div>
          <div>{</div>
          <div>   bar(foo());</div>
          <div>}</div>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>Thanks for any advice,</div>
        <div>-- Matthew P. Del Buono</div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
cfe-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
    </blockquote>
    <p><br>
    </p>
    <pre class="moz-signature" cols="72">-- 
Best regards,
Aleksei Sidorin,
SRR, Samsung Electronics
</pre>
  </body>
</html>