On Aug 3, 2012, at 4:09 PM, Jordan Rose wrote:
> Author: jrose
> Date: Fri Aug 3 18:09:01 2012
> New Revision: 161280
>
> URL: http://llvm.org/viewvc/llvm-project?rev=161280&view=rev
> Log:
> [analyzer] When a symbol is null, we should track its constraints.
>
> Because of this, we would previously emit NO path notes when a parameter
> is constrained to null (because there are no stores). Now we show where we
> made the assumption, which is much more useful.
>
> Modified:
>
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> cfe/trunk/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/DivZeroChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCAtSyncChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefBranchChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedArraySubscriptChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/VLASizeChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> cfe/trunk/test/Analysis/inlining/path-notes.c
> cfe/trunk/test/Analysis/method-call-path-notes.cpp
>
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> ---
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> (original)
> +++
> cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
> Fri Aug 3 18:09:01 2012
> @@ -226,9 +226,8 @@
>
> namespace bugreporter {
>
> -BugReporterVisitor *getTrackNullOrUndefValueVisitor(const ExplodedNode *N,
> - const Stmt *S,
> - BugReport *R);
> +void addTrackNullOrUndefValueVisitor(const ExplodedNode *N, const Stmt *S,
> + BugReport *R);
>
> const Stmt *GetDerefExpr(const ExplodedNode *N);
> const Stmt *GetDenomExpr(const ExplodedNode *N);
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -105,8 +105,7 @@
> // Highlight the range of the argument that was null.
> R->addRange(Call.getArgSourceRange(idx));
> if (const Expr *ArgE = Call.getArgExpr(idx))
> -
> R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(errorNode,
> - ArgE,
> R));
> + bugreporter::addTrackNullOrUndefValueVisitor(errorNode, ArgE, R);
> // Emit the bug report.
> C.EmitReport(R);
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
> (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp Fri
> Aug 3 18:09:01 2012
> @@ -432,8 +432,7 @@
>
> BugReport *report = new BugReport(*BT, description, N);
> report->addRange(Arg->getSourceRange());
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, Arg,
> - report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, Arg, report);
> C.EmitReport(report);
> return;
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -252,8 +252,7 @@
> BugReport *report = new BugReport(*BT, os.str(), N);
>
> report->addRange(S->getSourceRange());
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, S,
> - report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, S, report);
> C.EmitReport(report);
> return NULL;
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp Fri Aug
> 3 18:09:01 2012
> @@ -75,7 +75,7 @@
> BugReport *R = new BugReport(*BT, BT->getName(), N);
> if (BadE) {
> R->addRange(BadE->getSourceRange());
> - R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, BadE, R));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, BadE, R);
> }
> C.EmitReport(R);
> }
> @@ -122,8 +122,7 @@
> BugReport *R = new BugReport(*BT, Desc, N);
> R->addRange(argRange);
> if (argEx)
> - R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, argEx,
> - R));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, argEx, R);
> C.EmitReport(R);
> }
> return true;
> @@ -320,9 +319,7 @@
>
> // FIXME: getTrackNullOrUndefValueVisitor can't handle "super" yet.
> if (const Expr *ReceiverE = ME->getInstanceReceiver())
> - R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> - ReceiverE,
> - R));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, ReceiverE, R);
> C.EmitReport(R);
> }
> return;
> @@ -364,9 +361,7 @@
> report->addRange(ME->getReceiverRange());
> // FIXME: This won't track "self" in messages to super.
> if (const Expr *receiver = ME->getInstanceReceiver()) {
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> - receiver,
> - report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, receiver, report);
> }
> C.EmitReport(report);
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -166,10 +166,8 @@
> buf.empty() ? BT_null->getDescription() : buf.str(),
> N);
>
> - report->addVisitor(
> - bugreporter::getTrackNullOrUndefValueVisitor(N,
> -
> bugreporter::GetDerefExpr(N),
> - report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N,
> bugreporter::GetDerefExpr(N),
> + report);
>
> for (SmallVectorImpl<SourceRange>::iterator
> I = Ranges.begin(), E = Ranges.end(); I!=E; ++I)
> @@ -193,8 +191,9 @@
>
> BugReport *report =
> new BugReport(*BT_undef, BT_undef->getDescription(), N);
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> - bugreporter::GetDerefExpr(N),
> report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N,
> +
> bugreporter::GetDerefExpr(N),
> + report);
> report->disablePathPruning();
> C.EmitReport(report);
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DivZeroChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DivZeroChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/DivZeroChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/DivZeroChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -42,8 +42,9 @@
> BugReport *R =
> new BugReport(*BT, Msg, N);
>
> - R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> - bugreporter::GetDenomExpr(N), R));
> + bugreporter::addTrackNullOrUndefValueVisitor(N,
> +
> bugreporter::GetDenomExpr(N),
> + R);
> C.EmitReport(R);
> }
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCAtSyncChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCAtSyncChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCAtSyncChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCAtSyncChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -50,8 +50,7 @@
> "for @synchronized"));
> BugReport *report =
> new BugReport(*BT_undef, BT_undef->getDescription(), N);
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, Ex,
> -
> report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, Ex, report);
> C.EmitReport(report);
> }
> return;
> @@ -74,8 +73,7 @@
> "(no synchronization will occur)"));
> BugReport *report =
> new BugReport(*BT_null, BT_null->getDescription(), N);
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> Ex,
> -
> report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, Ex, report);
>
> C.EmitReport(report);
> return;
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -55,8 +55,7 @@
>
> report->disablePathPruning();
> report->addRange(RetE->getSourceRange());
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, RetE,
> - report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, RetE, report);
>
> C.EmitReport(report);
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/UndefBranchChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UndefBranchChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/UndefBranchChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/UndefBranchChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -99,7 +99,7 @@
>
> // Emit the bug report.
> BugReport *R = new BugReport(*BT, BT->getDescription(), N);
> - R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, Ex, R));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, Ex, R);
> R->addRange(Ex->getSourceRange());
> R->disablePathPruning();
>
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -76,12 +76,10 @@
> BugReport *report = new BugReport(*BT, OS.str(), N);
> if (Ex) {
> report->addRange(Ex->getSourceRange());
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, Ex,
> -
> report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, Ex, report);
> }
> else
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, B,
> -
> report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, B, report);
>
> report->disablePathPruning();
> C.EmitReport(report);
>
> Modified:
> cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedArraySubscriptChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedArraySubscriptChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedArraySubscriptChecker.cpp
> (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedArraySubscriptChecker.cpp
> Fri Aug 3 18:09:01 2012
> @@ -42,9 +42,7 @@
> // Generate a report for this bug.
> BugReport *R = new BugReport(*BT, BT->getName(), N);
> R->addRange(A->getIdx()->getSourceRange());
> - R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> - A->getIdx(),
> - R));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, A->getIdx(), R);
> C.EmitReport(R);
> }
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp
> (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp Fri
> Aug 3 18:09:01 2012
> @@ -78,7 +78,7 @@
> BugReport *R = new BugReport(*BT, str, N);
> if (ex) {
> R->addRange(ex->getSourceRange());
> - R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, ex, R));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, ex, R);
> }
> R->disablePathPruning();
> C.EmitReport(R);
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -224,8 +224,7 @@
> BugReport *report = new BugReport(*BT_mallocZero, os.str(), N);
>
> report->addRange(arg->getSourceRange());
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, arg,
> - report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, arg, report);
> C.EmitReport(report);
>
> return true;
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/VLASizeChecker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/VLASizeChecker.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/VLASizeChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/VLASizeChecker.cpp Fri Aug 3
> 18:09:01 2012
> @@ -69,8 +69,7 @@
>
> BugReport *report = new BugReport(*BT, os.str(), N);
> report->addRange(SizeE->getSourceRange());
> - report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, SizeE,
> - report));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, SizeE, report);
> C.EmitReport(report);
> return;
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Fri Aug 3
> 18:09:01 2012
> @@ -197,6 +197,9 @@
> os << "declared without an initial value";
> }
> }
> + else {
> + os << "initialized here";
> + }
> }
> }
>
> @@ -223,7 +226,7 @@
> << " is assigned to ";
> }
> else
> - return NULL;
> + os << "Value assigned to ";
>
> if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
> os << '\'' << *VR->getDecl() << '\'';
> @@ -293,12 +296,11 @@
> return NULL;
> }
>
> -BugReporterVisitor *
> -bugreporter::getTrackNullOrUndefValueVisitor(const ExplodedNode *N,
> - const Stmt *S,
> - BugReport *report) {
> +void bugreporter::addTrackNullOrUndefValueVisitor(const ExplodedNode *N,
> + const Stmt *S,
> + BugReport *report) {
> if (!S || !N)
> - return 0;
> + return;
>
> ProgramStateManager &StateMgr = N->getState()->getStateManager();
>
> @@ -314,7 +316,7 @@
> }
>
> if (!N)
> - return 0;
> + return;
>
> ProgramStateRef state = N->getState();
>
> @@ -331,7 +333,15 @@
> SVal V = state->getRawSVal(loc::MemRegionVal(R));
> report->markInteresting(R);
> report->markInteresting(V);
> - return new FindLastStoreBRVisitor(V, R);
> +
> + if (V.getAsLocSymbol()) {
> + BugReporterVisitor *ConstraintTracker
> + = new TrackConstraintBRVisitor(cast<loc::MemRegionVal>(V),
> false);
> + report->addVisitor(ConstraintTracker);
> + }
> +
> + report->addVisitor(new FindLastStoreBRVisitor(V, R));
> + return;
> }
> }
> }
> @@ -351,11 +361,10 @@
>
> if (R) {
> report->markInteresting(R);
> - return new TrackConstraintBRVisitor(loc::MemRegionVal(R), false);
> + report->addVisitor(new TrackConstraintBRVisitor(loc::MemRegionVal(R),
> + false));
> }
> }
> -
> - return 0;
> }
>
> BugReporterVisitor *
> @@ -397,7 +406,7 @@
> // The receiver was nil, and hence the method was skipped.
> // Register a BugReporterVisitor to issue a message telling us how
> // the receiver was null.
> - BR.addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N, Receiver,
> &BR));
> + bugreporter::addTrackNullOrUndefValueVisitor(N, Receiver, &BR);
> // Issue a message saying that the method was skipped.
> PathDiagnosticLocation L(Receiver, BRC.getSourceManager(),
> N->getLocationContext());
>
> 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=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/inlining/path-notes.c (original)
> +++ cfe/trunk/test/Analysis/inlining/path-notes.c Fri Aug 3 18:09:01 2012
> @@ -11,4 +11,46 @@
> // expected-note@-2 {{Returning from 'zero'}}
> *a = 1; // expected-warning{{Dereference of null pointer}}
> // expected-note@-1 {{Dereference of null pointer (loaded from variable
> 'a')}}
> -}
> \ No newline at end of file
> +}
> +
> +
> +void check(int *p) {
> + if (p) {
> + // expected-note@-1 + {{Assuming 'p' is null}}
> + // expected-note@-2 + {{Assuming pointer value is null}}
> + // expected-note@-3 + {{Taking false branch}}
A lot of redundant diagnostics here.
> + return;
> + }
> + return;
> +}
> +
> +void testCheck(int *a) {
> + check(a);
> + // expected-note@-1 {{Calling 'check'}}
> + // expected-note@-2 {{Returning from 'check'}}
> + *a = 1; // expected-warning{{Dereference of null pointer}}
> + // expected-note@-1 {{Dereference of null pointer (loaded from variable
> 'a')}}
> +}
> +
> +
> +int *getPointer();
> +
> +void testInitCheck() {
> + int *a = getPointer();
> + // expected-note@-1 {{Variable 'a' initialized here}}
I am not convinced that the extra info is necessary for explaining this bug:
1) a is initialized,
2) it's assigned to 0
3) a is dereferenced
#1 seems to be not important in this example (and the next).
I general, we want to keep the output to the minimum and only include
diagnostics needed to understand the bug.
We would love to show where a variable was NOT initialized, but that's not
easy/possible :)
> + check(a);
> + // expected-note@-1 {{Calling 'check'}}
> + // expected-note@-2 {{Returning from 'check'}}
> + *a = 1; // expected-warning{{Dereference of null pointer}}
> + // expected-note@-1 {{Dereference of null pointer (loaded from variable
> 'a')}}
> +}
> +
> +void testStoreCheck(int *a) {
> + a = getPointer();
> + // expected-note@-1 {{Value assigned to 'a'}}
> + check(a);
> + // expected-note@-1 {{Calling 'check'}}
> + // expected-note@-2 {{Returning from 'check'}}
> + *a = 1; // expected-warning{{Dereference of null pointer}}
> + // expected-note@-1 {{Dereference of null pointer (loaded from variable
> 'a')}}
> +}
>
> Modified: cfe/trunk/test/Analysis/method-call-path-notes.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/method-call-path-notes.cpp?rev=161280&r1=161279&r2=161280&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/method-call-path-notes.cpp (original)
> +++ cfe/trunk/test/Analysis/method-call-path-notes.cpp Fri Aug 3 18:09:01
> 2012
> @@ -24,7 +24,7 @@
> }
>
> void test_ic_null(TestInstanceCall *p) {
> - if (!p) // expected-note {{Taking true branch}}
> + if (!p) // expected-note {{Assuming pointer value is null}} expected-note
> {{Taking true branch}}
Is the goal to show both notes in the output? The new one is more useful, but
it makes the second one redundant. Maybe we could suppress the other one if the
better diagnostic is available?
> p->foo(); // expected-warning {{Called C++ object pointer is null}}
> expected-note{{Called C++ object pointer is null}}
> }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits