From: Ted Kremenek Date: Wed, 30 Jul 2008 17:49:12 +0000 (+0000) Subject: Add range highlighting for path-sensitive return-of-stack-address check. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b7714b291bdb5421eb9df527966fae5061332058;p=clang 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 --- 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* N = *I; + Stmt *S = cast(N->getLocation()).getStmt(); + Expr* E = cast(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(*I)) { Expr* E2 = FindExpr(ExI); if (E2) return E2;