diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-07-30 17:49:12 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-07-30 17:49:12 +0000 |
commit | b7714b291bdb5421eb9df527966fae5061332058 (patch) | |
tree | 742fb6f517505386d388ef3a6485dfb8ad556169 /lib/Analysis/GRExprEngineInternalChecks.cpp | |
parent | 9986eabd4423d867262c358ca62f94a60ac58412 (diff) |
Add range highlighting for path-sensitive return-of-stack-address check.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54219 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/GRExprEngineInternalChecks.cpp')
-rw-r--r-- | lib/Analysis/GRExprEngineInternalChecks.cpp | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/lib/Analysis/GRExprEngineInternalChecks.cpp b/lib/Analysis/GRExprEngineInternalChecks.cpp index c1128ccd1c..853c6544e8 100644 --- a/lib/Analysis/GRExprEngineInternalChecks.cpp +++ b/lib/Analysis/GRExprEngineInternalChecks.cpp @@ -181,7 +181,21 @@ public: "Address of stack-allocated variable returned.") {} virtual void EmitBuiltinWarnings(BugReporter& BR, GRExprEngine& Eng) { - Emit(BR, Eng.ret_stackaddr_begin(), Eng.ret_stackaddr_end()); + for (GRExprEngine::ret_stackaddr_iterator I=Eng.ret_stackaddr_begin(), + End = Eng.ret_stackaddr_end(); I!=End; ++I) { + + // Generate a report for this bug. + RangedBugReport report(*this, *I); + + ExplodedNode<ValueState>* N = *I; + Stmt *S = cast<PostStmt>(N->getLocation()).getStmt(); + Expr* E = cast<ReturnStmt>(S)->getRetValue(); + assert (E && "Return expression cannot be NULL"); + report.addRange(E->getSourceRange()); + + // Emit the warning. + BR.EmitWarning(report); + } } }; @@ -193,12 +207,11 @@ class VISIBILITY_HIDDEN UndefBranch : public BuiltinBug { FindUndefExpr(ValueStateManager& V, const ValueState* S) : VM(V), St(S) {} - Expr* FindExpr(Expr* Ex) { - + Expr* FindExpr(Expr* Ex) { if (!MatchesCriteria(Ex)) - return 0; + return 0; - for (Stmt::child_iterator I=Ex->child_begin(), E=Ex->child_end(); I!=E; ++I) + for (Stmt::child_iterator I=Ex->child_begin(), E=Ex->child_end();I!=E;++I) if (Expr* ExI = dyn_cast_or_null<Expr>(*I)) { Expr* E2 = FindExpr(ExI); if (E2) return E2; |