[cfe-commits] r161280 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/BugReporter/ lib/StaticAnalyzer/Checkers/ lib/StaticAnalyzer/Core/ test/Analysis/ test/Analysis/inlining/

Anna Zaks ganna at apple.com
Fri Aug 3 17:43:01 PDT 2012


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 at -2 {{Returning from 'zero'}}
>   *a = 1; // expected-warning{{Dereference of null pointer}}
>   // expected-note at -1 {{Dereference of null pointer (loaded from variable 'a')}}
> -}
> \ No newline at end of file
> +}
> +
> +
> +void check(int *p) {
> +  if (p) {
> +    // expected-note at -1 + {{Assuming 'p' is null}}
> +    // expected-note at -2 + {{Assuming pointer value is null}}
> +    // expected-note at -3 + {{Taking false branch}}

 A lot of redundant diagnostics here.

> +    return;
> +  }
> +  return;
> +}
> +
> +void testCheck(int *a) {
> +  check(a);
> +  // expected-note at -1 {{Calling 'check'}}
> +  // expected-note at -2 {{Returning from 'check'}}
> +  *a = 1; // expected-warning{{Dereference of null pointer}}
> +  // expected-note at -1 {{Dereference of null pointer (loaded from variable 'a')}}
> +}
> +
> +
> +int *getPointer();
> +
> +void testInitCheck() {
> +  int *a = getPointer();
> +  // expected-note at -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 at -1 {{Calling 'check'}}
> +  // expected-note at -2 {{Returning from 'check'}}
> +  *a = 1; // expected-warning{{Dereference of null pointer}}
> +  // expected-note at -1 {{Dereference of null pointer (loaded from variable 'a')}}
> +}
> +
> +void testStoreCheck(int *a) {
> +  a = getPointer();
> +  // expected-note at -1 {{Value assigned to 'a'}}
> +  check(a);
> +  // expected-note at -1 {{Calling 'check'}}
> +  // expected-note at -2 {{Returning from 'check'}}
> +  *a = 1; // expected-warning{{Dereference of null pointer}}
> +  // expected-note at -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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list