diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-01-09 20:05:00 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-01-09 20:05:00 +0000 |
commit | 9aa01441c33fbf2d3eac8ffe5ddad87341d1710b (patch) | |
tree | 0a6fcc34b725ba25accae792bac55b49337aef77 /clang/lib/Analysis/ReturnStackAddressChecker.cpp | |
parent | b867746a05cf467bf50285b7ad22099cefd3ad76 (diff) | |
download | bcm5719-llvm-9aa01441c33fbf2d3eac8ffe5ddad87341d1710b.tar.gz bcm5719-llvm-9aa01441c33fbf2d3eac8ffe5ddad87341d1710b.zip |
Fix broken diagnostic when returning the address of a stack-allocated array.
llvm-svn: 93071
Diffstat (limited to 'clang/lib/Analysis/ReturnStackAddressChecker.cpp')
-rw-r--r-- | clang/lib/Analysis/ReturnStackAddressChecker.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/clang/lib/Analysis/ReturnStackAddressChecker.cpp b/clang/lib/Analysis/ReturnStackAddressChecker.cpp index 3a6d8a41c06..4d7e8ade98f 100644 --- a/clang/lib/Analysis/ReturnStackAddressChecker.cpp +++ b/clang/lib/Analysis/ReturnStackAddressChecker.cpp @@ -67,6 +67,9 @@ void ReturnStackAddressChecker::PreVisitReturnStmt(CheckerContext &C, llvm::raw_svector_ostream os(buf); SourceRange range; + // Get the base region, stripping away fields and elements. + R = R->getBaseRegion(); + // Check if the region is a compound literal. if (const CompoundLiteralRegion* CR = dyn_cast<CompoundLiteralRegion>(R)) { const CompoundLiteralExpr* CL = CR->getLiteralExpr(); @@ -92,13 +95,18 @@ void ReturnStackAddressChecker::PreVisitReturnStmt(CheckerContext &C, << C.getSourceManager().getInstantiationLineNumber(L) << " returned to caller"; } - else { + else if (const VarRegion *VR = dyn_cast<VarRegion>(R)) { os << "Address of stack memory associated with local variable '" - << R->getString() << "' returned."; + << VR->getString() << "' returned"; + range = VR->getDecl()->getSourceRange(); + } + else { + assert(false && "Invalid region in ReturnStackAddressChecker."); + return; } RangedBugReport *report = new RangedBugReport(*BT, os.str(), N); - report->addRange(RS->getSourceRange()); + report->addRange(RetE->getSourceRange()); if (range.isValid()) report->addRange(range); |