From 390909c89c98ab1807e15e033a72e975f866fb23 Mon Sep 17 00:00:00 2001 From: Anna Zaks Date: Thu, 6 Oct 2011 00:43:15 +0000 Subject: [PATCH] [analyzer] Remove the dependency on CheckerContext::getStmt() as well as the method itself. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141262 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/StaticAnalyzer/Core/Checker.h | 10 ++++++---- include/clang/StaticAnalyzer/Core/CheckerManager.h | 8 +++++--- .../Core/PathSensitive/CheckerContext.h | 1 - lib/StaticAnalyzer/Checkers/ArrayBoundChecker.cpp | 7 ++++--- .../Checkers/ArrayBoundCheckerV2.cpp | 4 +++- lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp | 8 ++++---- lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 14 +++++++++----- lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp | 4 +++- .../Checkers/ObjCSelfInitChecker.cpp | 4 +++- lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp | 4 ++-- .../Checkers/UndefinedAssignmentChecker.cpp | 5 +++-- lib/StaticAnalyzer/Core/CheckerManager.cpp | 4 ++-- 12 files changed, 44 insertions(+), 29 deletions(-) diff --git a/include/clang/StaticAnalyzer/Core/Checker.h b/include/clang/StaticAnalyzer/Core/Checker.h index 82fbd46222..1e4edeb0c7 100644 --- a/include/clang/StaticAnalyzer/Core/Checker.h +++ b/include/clang/StaticAnalyzer/Core/Checker.h @@ -152,9 +152,10 @@ public: class Location { template - static void _checkLocation(void *checker, const SVal &location, bool isLoad, + static void _checkLocation(void *checker, + const SVal &location, bool isLoad, const Stmt *S, CheckerContext &C) { - ((const CHECKER *)checker)->checkLocation(location, isLoad, C); + ((const CHECKER *)checker)->checkLocation(location, isLoad, S, C); } public: @@ -167,9 +168,10 @@ public: class Bind { template - static void _checkBind(void *checker, const SVal &location, const SVal &val, + static void _checkBind(void *checker, + const SVal &location, const SVal &val, const Stmt *S, CheckerContext &C) { - ((const CHECKER *)checker)->checkBind(location, val, C); + ((const CHECKER *)checker)->checkBind(location, val, S, C); } public: diff --git a/include/clang/StaticAnalyzer/Core/CheckerManager.h b/include/clang/StaticAnalyzer/Core/CheckerManager.h index 89b6e69e5a..e3e4c49f71 100644 --- a/include/clang/StaticAnalyzer/Core/CheckerManager.h +++ b/include/clang/StaticAnalyzer/Core/CheckerManager.h @@ -320,11 +320,13 @@ public: typedef CheckerFn CheckObjCMessageFunc; - typedef CheckerFn + typedef CheckerFn CheckLocationFunc; - typedef CheckerFn CheckBindFunc; + typedef CheckerFn + CheckBindFunc; typedef CheckerFn CheckEndAnalysisFunc; diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h index 19daaa537f..03ab588a51 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h @@ -80,7 +80,6 @@ public: ExplodedNodeSet &getNodeSet() { return Dst; } ExplodedNode *&getPredecessor() { return Pred; } const ProgramState *getState() { return ST ? ST : Pred->getState(); } - const Stmt *getStmt() const { return statement; } /// \brief Returns the number of times the current block has been visited /// along the analyzed path. diff --git a/lib/StaticAnalyzer/Checkers/ArrayBoundChecker.cpp b/lib/StaticAnalyzer/Checkers/ArrayBoundChecker.cpp index b008f97d99..6935c5f1c1 100644 --- a/lib/StaticAnalyzer/Checkers/ArrayBoundChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/ArrayBoundChecker.cpp @@ -27,11 +27,12 @@ class ArrayBoundChecker : public Checker { mutable llvm::OwningPtr BT; public: - void checkLocation(SVal l, bool isLoad, CheckerContext &C) const; + void checkLocation(SVal l, bool isLoad, const Stmt* S, + CheckerContext &C) const; }; } -void ArrayBoundChecker::checkLocation(SVal l, bool isLoad, +void ArrayBoundChecker::checkLocation(SVal l, bool isLoad, const Stmt* LoadS, CheckerContext &C) const { // Check for out of bound array element access. const MemRegion *R = l.getAsRegion(); @@ -76,7 +77,7 @@ void ArrayBoundChecker::checkLocation(SVal l, bool isLoad, BugReport *report = new BugReport(*BT, BT->getDescription(), N); - report->addRange(C.getStmt()->getSourceRange()); + report->addRange(LoadS->getSourceRange()); C.EmitReport(report); return; } diff --git a/lib/StaticAnalyzer/Checkers/ArrayBoundCheckerV2.cpp b/lib/StaticAnalyzer/Checkers/ArrayBoundCheckerV2.cpp index 2a846aa5b1..6175028a9b 100644 --- a/lib/StaticAnalyzer/Checkers/ArrayBoundCheckerV2.cpp +++ b/lib/StaticAnalyzer/Checkers/ArrayBoundCheckerV2.cpp @@ -34,7 +34,8 @@ class ArrayBoundCheckerV2 : OOB_Kind kind) const; public: - void checkLocation(SVal l, bool isLoad, CheckerContext &C) const; + void checkLocation(SVal l, bool isLoad, const Stmt*S, + CheckerContext &C) const; }; // FIXME: Eventually replace RegionRawOffset with this class. @@ -79,6 +80,7 @@ static SVal computeExtentBegin(SValBuilder &svalBuilder, } void ArrayBoundCheckerV2::checkLocation(SVal location, bool isLoad, + const Stmt* LoadS, CheckerContext &checkerContext) const { // NOTE: Instead of using ProgramState::assumeInBound(), we are prototyping diff --git a/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp b/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp index c416dd8e8e..eeda734a07 100644 --- a/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp @@ -29,7 +29,8 @@ class DereferenceChecker mutable llvm::OwningPtr BT_undef; public: - void checkLocation(SVal location, bool isLoad, CheckerContext &C) const; + void checkLocation(SVal location, bool isLoad, const Stmt* S, + CheckerContext &C) const; static void AddDerefSource(raw_ostream &os, SmallVectorImpl &Ranges, @@ -38,7 +39,7 @@ public: } // end anonymous namespace void DereferenceChecker::AddDerefSource(raw_ostream &os, - SmallVectorImpl &Ranges, + SmallVectorImpl &Ranges, const Expr *Ex, bool loadedFrom) { Ex = Ex->IgnoreParenLValueCasts(); @@ -65,7 +66,7 @@ void DereferenceChecker::AddDerefSource(raw_ostream &os, } } -void DereferenceChecker::checkLocation(SVal l, bool isLoad, +void DereferenceChecker::checkLocation(SVal l, bool isLoad, const Stmt* S, CheckerContext &C) const { // Check for dereference of an undefined value. if (l.isUndef()) { @@ -88,7 +89,6 @@ void DereferenceChecker::checkLocation(SVal l, bool isLoad, if (!isa(location)) return; - const Stmt *S = C.getStmt(); const ProgramState *state = C.getState(); const ProgramState *notNullState, *nullState; llvm::tie(notNullState, nullState) = state->assume(location); diff --git a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index b25ae6cf6f..15dff3e505 100644 --- a/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -82,8 +82,10 @@ public: void checkPreStmt(const ReturnStmt *S, CheckerContext &C) const; const ProgramState *evalAssume(const ProgramState *state, SVal Cond, bool Assumption) const; - void checkLocation(SVal l, bool isLoad, CheckerContext &C) const; - void checkBind(SVal location, SVal val, CheckerContext &C) const; + void checkLocation(SVal l, bool isLoad, const Stmt *S, + CheckerContext &C) const; + void checkBind(SVal location, SVal val, const Stmt*S, + CheckerContext &C) const; private: static void MallocMem(CheckerContext &C, const CallExpr *CE); @@ -661,7 +663,8 @@ const ProgramState *MallocChecker::evalAssume(const ProgramState *state, SVal Co } // Check if the location is a freed symbolic region. -void MallocChecker::checkLocation(SVal l, bool isLoad,CheckerContext &C) const { +void MallocChecker::checkLocation(SVal l, bool isLoad, const Stmt *S, + CheckerContext &C) const { SymbolRef Sym = l.getLocSymbolInBase(); if (Sym) { const RefState *RS = C.getState()->get(Sym); @@ -679,7 +682,8 @@ void MallocChecker::checkLocation(SVal l, bool isLoad,CheckerContext &C) const { } } -void MallocChecker::checkBind(SVal location, SVal val,CheckerContext &C) const { +void MallocChecker::checkBind(SVal location, SVal val, + const Stmt *BindS, CheckerContext &C) const { // The PreVisitBind implements the same algorithm as already used by the // Objective C ownership checker: if the pointer escaped from this scope by // assignment, let it go. However, assigning to fields of a stack-storage @@ -728,7 +732,7 @@ void MallocChecker::checkBind(SVal location, SVal val,CheckerContext &C) const { // We no longer own this pointer. notNullState = notNullState->set(Sym, - RefState::getRelinquished(C.getStmt())); + RefState::getRelinquished(BindS)); } while (false); } diff --git a/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp b/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp index 3e4a49415c..5678998359 100644 --- a/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp @@ -157,7 +157,8 @@ public: NSOrCFErrorDerefChecker() : NSErrorII(0), CFErrorII(0), ShouldCheckNSError(0), ShouldCheckCFError(0) { } - void checkLocation(SVal loc, bool isLoad, CheckerContext &C) const; + void checkLocation(SVal loc, bool isLoad, const Stmt *S, + CheckerContext &C) const; void checkEvent(ImplicitNullDerefEvent event) const; }; } @@ -211,6 +212,7 @@ static QualType parameterTypeFromSVal(SVal val, CheckerContext &C) { } void NSOrCFErrorDerefChecker::checkLocation(SVal loc, bool isLoad, + const Stmt *S, CheckerContext &C) const { if (!isLoad) return; diff --git a/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp b/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp index 8b3e0f7642..2fb9944afa 100644 --- a/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp @@ -77,7 +77,8 @@ public: void checkPreStmt(const ReturnStmt *S, CheckerContext &C) const; void checkPreStmt(const CallExpr *CE, CheckerContext &C) const; void checkPostStmt(const CallExpr *CE, CheckerContext &C) const; - void checkLocation(SVal location, bool isLoad, CheckerContext &C) const; + void checkLocation(SVal location, bool isLoad, const Stmt *S, + CheckerContext &C) const; }; } // end anonymous namespace @@ -295,6 +296,7 @@ void ObjCSelfInitChecker::checkPostStmt(const CallExpr *CE, } void ObjCSelfInitChecker::checkLocation(SVal location, bool isLoad, + const Stmt *S, CheckerContext &C) const { // Tag the result of a load from 'self' so that we can easily know that the // value is the object that 'self' points to. diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index b9afe0403d..9b2331713a 100644 --- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -2409,7 +2409,7 @@ public: void printState(raw_ostream &Out, const ProgramState *State, const char *NL, const char *Sep) const; - void checkBind(SVal loc, SVal val, CheckerContext &C) const; + void checkBind(SVal loc, SVal val, const Stmt *S, CheckerContext &C) const; void checkPostStmt(const BlockExpr *BE, CheckerContext &C) const; void checkPostStmt(const CastExpr *CE, CheckerContext &C) const; @@ -3225,7 +3225,7 @@ void RetainCountChecker::checkReturnWithRetEffect(const ReturnStmt *S, // Check various ways a symbol can be invalidated. //===----------------------------------------------------------------------===// -void RetainCountChecker::checkBind(SVal loc, SVal val, +void RetainCountChecker::checkBind(SVal loc, SVal val, const Stmt *S, CheckerContext &C) const { // Are we storing to something that causes the value to "escape"? bool escapes = true; diff --git a/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp b/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp index b0c4bee424..5ca4a9fe46 100644 --- a/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp @@ -27,11 +27,13 @@ class UndefinedAssignmentChecker mutable llvm::OwningPtr BT; public: - void checkBind(SVal location, SVal val, CheckerContext &C) const; + void checkBind(SVal location, SVal val, const Stmt *S, + CheckerContext &C) const; }; } void UndefinedAssignmentChecker::checkBind(SVal location, SVal val, + const Stmt *StoreE, CheckerContext &C) const { if (!val.isUndef()) return; @@ -49,7 +51,6 @@ void UndefinedAssignmentChecker::checkBind(SVal location, SVal val, // Generate a report for this bug. const Expr *ex = 0; - const Stmt *StoreE = C.getStmt(); while (StoreE) { if (const BinaryOperator *B = dyn_cast(StoreE)) { if (B->isCompoundAssignmentOp()) { diff --git a/lib/StaticAnalyzer/Core/CheckerManager.cpp b/lib/StaticAnalyzer/Core/CheckerManager.cpp index 6391cb3721..ac4358d6fe 100644 --- a/lib/StaticAnalyzer/Core/CheckerManager.cpp +++ b/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -219,7 +219,7 @@ namespace { CheckerContext C(Dst, Eng.getBuilder(), Eng, Pred, checkFn.Checker, IsLoad ? ProgramPoint::PreLoadKind : ProgramPoint::PreStoreKind, 0, S); - checkFn(Loc, IsLoad, C); + checkFn(Loc, IsLoad, S, C); } }; } @@ -253,7 +253,7 @@ namespace { ExplodedNodeSet &Dst, ExplodedNode *Pred) { CheckerContext C(Dst, Eng.getBuilder(), Eng, Pred, checkFn.Checker, ProgramPoint::PreStmtKind, 0, S); - checkFn(Loc, Val, C); + checkFn(Loc, Val, S, C); } }; } -- 2.40.0