[cfe-commits] r162563 - in /cfe/trunk: lib/StaticAnalyzer/Core/BugReporterVisitors.cpp test/Analysis/inlining/path-notes.c
Anna Zaks
ganna at apple.com
Fri Aug 24 18:57:01 PDT 2012
This needs a lot more comments!
Also, this example should probably be handled by this as well:
int *getZero() {
int *p = 0;
return p;
}
int testReturnZero() {
return *getZero(); // If you change it to '*getZero() = 1;' as in you example, it works.
}
On Aug 24, 2012, at 9:34 AM, Jordan Rose wrote:
> Author: jrose
> Date: Fri Aug 24 11:34:31 2012
> New Revision: 162563
>
> URL: http://llvm.org/viewvc/llvm-project?rev=162563&view=rev
> Log:
> [analyzer] If we dereference a NULL that came from a function, show the return.
>
> More generally, any time we try to track where a null value came from, we
> should show if it came from a function. This usually isn't necessary if
> the value is symbolic, but if the value is just a constant we previously
> just ignored its origin entirely. Now, we'll step into the function and
> recursively add a visitor to the returned expression.
>
> <rdar://problem/12114609>
>
> Modified:
> cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> cfe/trunk/test/Analysis/inlining/path-notes.c
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=162563&r1=162562&r2=162563&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Fri Aug 24 11:34:31 2012
> @@ -296,6 +296,49 @@
> return NULL;
> }
>
> +namespace {
comment
> +class ReturnNullVisitor : public BugReporterVisitorImpl<ReturnNullVisitor> {
> + const ExplodedNode *ReturnNode;
> +public:
> + ReturnNullVisitor(const ExplodedNode *N) : ReturnNode(N) {}
> +
> + virtual void Profile(llvm::FoldingSetNodeID &ID) const {
> + static int Tag = 0;
> + ID.AddPointer(&Tag);
> + ID.Add(*ReturnNode);
> + }
> +
> + PathDiagnosticPiece *VisitNode(const ExplodedNode *N,
> + const ExplodedNode *PrevN,
> + BugReporterContext &BRC,
> + BugReport &BR) {
> + if (ReturnNode != BRC.getNodeResolver().getOriginalNode(N))
> + return 0;
> +
> + StmtPoint SP = cast<StmtPoint>(ReturnNode->getLocation());
> + const ReturnStmt *Ret = cast<ReturnStmt>(SP.getStmt());
> + PathDiagnosticLocation L(Ret, BRC.getSourceManager(),
> + N->getLocationContext());
> +
> + SmallString<64> Msg;
> + llvm::raw_svector_ostream Out(Msg);
> +
> + if (Loc::isLocType(Ret->getRetValue()->getType()))
> + Out << "Returning null pointer";
> + else
> + Out << "Returning zero";
> +
> + // FIXME: We should have a more generalized printing mechanism.
> + const Expr *RetE = Ret->getRetValue()->IgnoreParenCasts();
> + if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(RetE))
> + if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(DR->getDecl()))
> + Out << " (loaded from '" << *DD << "')";
> +
> + return new PathDiagnosticEventPiece(L, Out.str());
> + }
> +};
> +} // end anonymous namespace
> +
> void bugreporter::addTrackNullOrUndefValueVisitor(const ExplodedNode *N,
> "..Visitor" -> "..Visitors" and let's add comments to this function as well.
> const Stmt *S,
> BugReport *report) {
> @@ -311,6 +354,9 @@
> if (const PostStmt *ps = dyn_cast<PostStmt>(&pp)) {
> if (ps->getStmt() == S)
> break;
> + } else if (const CallExitEnd *CEE = dyn_cast<CallExitEnd>(&pp)) {
> + if (CEE->getCalleeContext()->getCallSite() == S)
> + break;
> }
> N = N->getFirstPred();
> }
> @@ -364,6 +410,28 @@
> report->addVisitor(new TrackConstraintBRVisitor(loc::MemRegionVal(R),
> false));
> }
> + } else {
Please, explain what we are trying to achieve here. Ex: "If the interesting statement 'S' is the call exit statement, visit its return with ReturnNullVisitor and track the returned value with undef or null visitors."
I hope I got it right:)
> + // Walk backwards to just before the post-statement checks.
This looks like it belongs to the entire else, not just the single-line 'while' loop below.
>
> + ProgramPoint PP = N->getLocation();
> + while (N && isa<PostStmt>(PP = N->getLocation()))
> + N = N->getFirstPred();
> +
> + if (N && isa<CallExitEnd>(PP)) {
> + // Find a ReturnStmt, if there is one.
> + do {
> + N = N->getFirstPred();
> + PP = N->getLocation();
> + } while (!isa<StmtPoint>(PP) && !isa<CallEnter>(PP));
> +
> + if (const StmtPoint *SP = dyn_cast<StmtPoint>(&PP)) {
> + if (const ReturnStmt *Ret = SP->getStmtAs<ReturnStmt>()) {
> + if (const Expr *RetE = Ret->getRetValue()) {
> + report->addVisitor(new ReturnNullVisitor(N));
comment
> + addTrackNullOrUndefValueVisitor(N, RetE, report);
> + }
> + }
> + }
> + }
> }
> }
>
>
> Modified: cfe/trunk/test/Analysis/inlining/path-notes.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inlining/path-notes.c?rev=162563&r1=162562&r2=162563&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/inlining/path-notes.c (original)
> +++ cfe/trunk/test/Analysis/inlining/path-notes.c Fri Aug 24 11:34:31 2012
> @@ -57,6 +57,38 @@
> }
>
>
> +int *getZero() {
> + int *p = 0;
> + // expected-note at -1 {{Variable 'p' initialized to a null pointer value}}
> + // ^ This note checks that we add a second visitor for the return value.
> + return p;
> + // expected-note at -1 {{Returning null pointer (loaded from 'p')}}
> +}
> +
> +void testReturnZero() {
> + *getZero() = 1; // expected-warning{{Dereference of null pointer}}
> + // expected-note at -1 {{Calling 'getZero'}}
> + // expected-note at -2 {{Returning from 'getZero'}}
> + // expected-note at -3 {{Dereference of null pointer}}
> +}
> +
> +void testInitZero() {
> + // FIXME: <rdar://problem/12114689> Diagnostics: Need to step into the function whose result is assigned to an interesting region
> + int *a = getZero();
> + // expected-note at -1 {{Variable 'a' initialized to a null pointer value}}
> + *a = 1; // expected-warning{{Dereference of null pointer}}
> + // expected-note at -1 {{Dereference of null pointer (loaded from variable 'a')}}
> +}
> +
> +void testStoreZero(int *a) {
> + // FIXME: <rdar://problem/12114689> Diagnostics: Need to step into the function whose result is assigned to an interesting region
> + a = getZero();
> + // expected-note at -1 {{Null pointer value stored to 'a'}}
> + *a = 1; // expected-warning{{Dereference of null pointer}}
> + // expected-note at -1 {{Dereference of null pointer (loaded from variable 'a')}}
> +}
> +
> +
> // CHECK: <?xml version="1.0" encoding="UTF-8"?>
> // CHECK: <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
> // CHECK: <plist version="1.0">
> @@ -1286,6 +1318,774 @@
> // CHECK: <key>file</key><integer>0</integer>
> // CHECK: </dict>
> // CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>path</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>10</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>12</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>0</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Calling 'getZero'</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Calling 'getZero'</string>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>60</integer>
> +// CHECK: <key>col</key><integer>1</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>depth</key><integer>1</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Entered call from 'testReturnZero'</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Entered call from 'testReturnZero'</string>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>60</integer>
> +// CHECK: <key>col</key><integer>1</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>60</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>61</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>61</integer>
> +// CHECK: <key>col</key><integer>5</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>61</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>61</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>61</integer>
> +// CHECK: <key>col</key><integer>8</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>1</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Variable 'p' initialized to a null pointer value</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Variable 'p' initialized to a null pointer value</string>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>61</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>61</integer>
> +// CHECK: <key>col</key><integer>5</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>64</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>64</integer>
> +// CHECK: <key>col</key><integer>8</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>64</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>64</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>64</integer>
> +// CHECK: <key>col</key><integer>10</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>1</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Returning null pointer (loaded from 'p')</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Returning null pointer (loaded from 'p')</string>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>12</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>1</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Returning from 'getZero'</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Returning from 'getZero'</string>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>10</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>10</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>16</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>0</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Dereference of null pointer</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Dereference of null pointer</string>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>description</key><string>Dereference of null pointer</string>
> +// CHECK: <key>category</key><string>Logic error</string>
> +// CHECK: <key>type</key><string>Dereference of null pointer</string>
> +// CHECK: <key>issue_context_kind</key><string>function</string>
> +// CHECK: <key>issue_context</key><string>testReturnZero</string>
> +// CHECK: <key>issue_hash</key><integer>1</integer>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>69</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>path</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>5</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>12</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>18</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>5</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>12</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>18</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>12</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>18</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>5</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>8</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>0</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Variable 'a' initialized to a null pointer value</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Variable 'a' initialized to a null pointer value</string>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>77</integer>
> +// CHECK: <key>col</key><integer>5</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>79</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>79</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>79</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>79</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>79</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>0</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Dereference of null pointer (loaded from variable 'a')</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Dereference of null pointer (loaded from variable 'a')</string>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string>
> +// CHECK: <key>category</key><string>Logic error</string>
> +// CHECK: <key>type</key><string>Dereference of null pointer</string>
> +// CHECK: <key>issue_context_kind</key><string>function</string>
> +// CHECK: <key>issue_context</key><string>testInitZero</string>
> +// CHECK: <key>issue_hash</key><integer>4</integer>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>79</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>path</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>7</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>13</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>7</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>13</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>7</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>13</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>15</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>0</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Null pointer value stored to 'a'</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Null pointer value stored to 'a'</string>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>control</string>
> +// CHECK: <key>edges</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>start</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>85</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>end</key>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>87</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>87</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>kind</key><string>event</string>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>87</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <key>ranges</key>
> +// CHECK: <array>
> +// CHECK: <array>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>87</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>87</integer>
> +// CHECK: <key>col</key><integer>4</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: </array>
> +// CHECK: <key>depth</key><integer>0</integer>
> +// CHECK: <key>extended_message</key>
> +// CHECK: <string>Dereference of null pointer (loaded from variable 'a')</string>
> +// CHECK: <key>message</key>
> +// CHECK: <string>Dereference of null pointer (loaded from variable 'a')</string>
> +// CHECK: </dict>
> +// CHECK: </array>
> +// CHECK: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string>
> +// CHECK: <key>category</key><string>Logic error</string>
> +// CHECK: <key>type</key><string>Dereference of null pointer</string>
> +// CHECK: <key>issue_context_kind</key><string>function</string>
> +// CHECK: <key>issue_context</key><string>testStoreZero</string>
> +// CHECK: <key>issue_hash</key><integer>4</integer>
> +// CHECK: <key>location</key>
> +// CHECK: <dict>
> +// CHECK: <key>line</key><integer>87</integer>
> +// CHECK: <key>col</key><integer>3</integer>
> +// CHECK: <key>file</key><integer>0</integer>
> +// CHECK: </dict>
> +// CHECK: </dict>
> // CHECK: </array>
> // CHECK: </dict>
> // CHECK: </plist>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120824/3dcc137b/attachment.html>
More information about the cfe-commits
mailing list