diff options
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp b/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp index 16fc67d5fa..4fd778ef58 100644 --- a/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/StackAddrEscapeChecker.cpp @@ -37,16 +37,16 @@ public: private: void EmitStackError(CheckerContext &C, const MemRegion *R, const Expr *RetE) const; - static SourceRange GenName(raw_ostream &os, const MemRegion *R, - SourceManager &SM); + static SourceRange genName(raw_ostream &os, const MemRegion *R, + ASTContext &Ctx); }; } -SourceRange StackAddrEscapeChecker::GenName(raw_ostream &os, - const MemRegion *R, - SourceManager &SM) { +SourceRange StackAddrEscapeChecker::genName(raw_ostream &os, const MemRegion *R, + ASTContext &Ctx) { // Get the base region, stripping away fields and elements. R = R->getBaseRegion(); + SourceManager &SM = Ctx.getSourceManager(); SourceRange range; os << "Address of "; @@ -79,8 +79,10 @@ SourceRange StackAddrEscapeChecker::GenName(raw_ostream &os, range = VR->getDecl()->getSourceRange(); } else if (const CXXTempObjectRegion *TOR = dyn_cast<CXXTempObjectRegion>(R)) { - os << "stack memory associated with temporary object of type '" - << TOR->getValueType().getAsString() << '\''; + QualType Ty = TOR->getValueType().getLocalUnqualifiedType(); + os << "stack memory associated with temporary object of type '"; + Ty.print(os, Ctx.getPrintingPolicy()); + os << "'"; range = TOR->getExpr()->getSourceRange(); } else { @@ -104,7 +106,7 @@ void StackAddrEscapeChecker::EmitStackError(CheckerContext &C, const MemRegion * // Generate a report for this bug. SmallString<512> buf; llvm::raw_svector_ostream os(buf); - SourceRange range = GenName(os, R, C.getSourceManager()); + SourceRange range = genName(os, R, C.getASTContext()); os << " returned to caller"; BugReport *report = new BugReport(*BT_returnstack, os.str(), N); report->addRange(RetE->getSourceRange()); @@ -224,8 +226,7 @@ void StackAddrEscapeChecker::checkEndFunction(CheckerContext &Ctx) const { // Generate a report for this bug. SmallString<512> buf; llvm::raw_svector_ostream os(buf); - SourceRange range = GenName(os, cb.V[i].second, - Ctx.getSourceManager()); + SourceRange range = genName(os, cb.V[i].second, Ctx.getASTContext()); os << " is still referred to by the global variable '"; const VarRegion *VR = cast<VarRegion>(cb.V[i].first->getBaseRegion()); os << *VR->getDecl() |