diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-11-21 01:50:48 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-11-21 01:50:48 +0000 |
commit | 78d722fb2b55e53914bc80046db65d113138b2a7 (patch) | |
tree | 0e58de9bb4ec7b5b88363242ed266c1b1af746d4 /lib/Analysis/DereferenceChecker.cpp | |
parent | c79d7d49c5ec42e8bb6ac34350ebb5bc24ca663d (diff) |
Restructure DereferenceChecker slightly to handle caching out when we would report a null dereference more than once.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89526 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/DereferenceChecker.cpp')
-rw-r--r-- | lib/Analysis/DereferenceChecker.cpp | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/lib/Analysis/DereferenceChecker.cpp b/lib/Analysis/DereferenceChecker.cpp index c3aa8f3a28..a8f5af34a7 100644 --- a/lib/Analysis/DereferenceChecker.cpp +++ b/lib/Analysis/DereferenceChecker.cpp @@ -82,29 +82,32 @@ void DereferenceChecker::VisitLocation(CheckerContext &C, const Stmt *S, // The explicit NULL case. if (nullState) { - // Generate an error node. - ExplodedNode *N = C.GenerateNode(S, nullState, true); - if (N) { - if (!notNullState) { - // We know that 'location' cannot be non-null. This is what - // we call an "explicit" null dereference. - if (!BT_null) - BT_null = new BuiltinBug("Null pointer dereference", - "Dereference of null pointer"); - - EnhancedBugReport *report = - new EnhancedBugReport(*BT_null, BT_null->getDescription(), N); - report->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, - bugreporter::GetDerefExpr(N)); - - C.EmitReport(report); + if (!notNullState) { + // Generate an error node. + ExplodedNode *N = C.GenerateNode(S, nullState, true); + if (!N) return; - } + + // We know that 'location' cannot be non-null. This is what + // we call an "explicit" null dereference. + if (!BT_null) + BT_null = new BuiltinBug("Null pointer dereference", + "Dereference of null pointer"); + EnhancedBugReport *report = + new EnhancedBugReport(*BT_null, BT_null->getDescription(), N); + report->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, + bugreporter::GetDerefExpr(N)); + + C.EmitReport(report); + return; + } + else { // Otherwise, we have the case where the location could either be // null or not-null. Record the error node as an "implicit" null - // dereference. - ImplicitNullDerefNodes.push_back(N); + // dereference. + if (ExplodedNode *N = C.GenerateNode(S, nullState, true)) + ImplicitNullDerefNodes.push_back(N); } } |