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 | 7960ec30d794da5de6cd017c728e1151f7b101b9 (patch) | |
tree | 2ea2d18c298a93530fb3fb3f979d7c8600e2ff14 /lib/Analysis/ReturnStackAddressChecker.cpp | |
parent | 32592e89e1903d4e2c1b96faf4fccf5e64f71a0e (diff) |
Fix broken diagnostic when returning the address of a stack-allocated array.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93071 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ReturnStackAddressChecker.cpp')
-rw-r--r-- | lib/Analysis/ReturnStackAddressChecker.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/Analysis/ReturnStackAddressChecker.cpp b/lib/Analysis/ReturnStackAddressChecker.cpp index 3a6d8a41c0..4d7e8ade98 100644 --- a/lib/Analysis/ReturnStackAddressChecker.cpp +++ b/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); |