Author: Youngsuk Kim Date: 2024-07-02T19:52:09-05:00 New Revision: 0856064ea219d029e7d2c4f68bb88196fe647f6b
URL: https://github.com/llvm/llvm-project/commit/0856064ea219d029e7d2c4f68bb88196fe647f6b DIFF: https://github.com/llvm/llvm-project/commit/0856064ea219d029e7d2c4f68bb88196fe647f6b.diff LOG: [clang][StaticAnalyzer] Avoid 'raw_string_ostream::str' (NFC) Since `raw_string_ostream` doesn't own the string buffer, it is desirable (in terms of memory safety) for users to directly reference the string buffer rather than use `raw_string_ostream::str()`. Work towards TODO comment to remove `raw_string_ostream::str()`. Added: Modified: clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp clang/lib/StaticAnalyzer/Core/ExprEngine.cpp clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp clang/lib/StaticAnalyzer/Core/SVals.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp b/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp index b4390f0b85bbe..9d3aeff465ca1 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp @@ -247,8 +247,8 @@ void ObjCDeallocChecker::checkASTDecl(const ObjCImplementationDecl *D, PathDiagnosticLocation DLoc = PathDiagnosticLocation::createBegin(D, BR.getSourceManager()); - BR.EmitBasicReport(D, this, Name, categories::CoreFoundationObjectiveC, - OS.str(), DLoc); + BR.EmitBasicReport(D, this, Name, categories::CoreFoundationObjectiveC, Buf, + DLoc); return; } } @@ -585,7 +585,7 @@ void ObjCDeallocChecker::diagnoseMissingReleases(CheckerContext &C) const { " before '[super dealloc]'"; auto BR = std::make_unique<PathSensitiveBugReport>(MissingReleaseBugType, - OS.str(), ErrNode); + Buf, ErrNode); C.emitReport(std::move(BR)); } @@ -706,8 +706,8 @@ bool ObjCDeallocChecker::diagnoseExtraRelease(SymbolRef ReleasedValue, OS << " property but was released in 'dealloc'"; } - auto BR = std::make_unique<PathSensitiveBugReport>(ExtraReleaseBugType, - OS.str(), ErrNode); + auto BR = std::make_unique<PathSensitiveBugReport>(ExtraReleaseBugType, Buf, + ErrNode); BR->addRange(M.getOriginExpr()->getSourceRange()); C.emitReport(std::move(BR)); @@ -749,7 +749,7 @@ bool ObjCDeallocChecker::diagnoseMistakenDealloc(SymbolRef DeallocedValue, << "' should be released rather than deallocated"; auto BR = std::make_unique<PathSensitiveBugReport>(MistakenDeallocBugType, - OS.str(), ErrNode); + Buf, ErrNode); BR->addRange(M.getOriginExpr()->getSourceRange()); C.emitReport(std::move(BR)); diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp index 086c3e5e49b77..f73c9007c1838 100644 --- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp @@ -411,11 +411,11 @@ annotateConsumedSummaryMismatch(const ExplodedNode *N, } } - if (os.str().empty()) + if (sbuf.empty()) return nullptr; PathDiagnosticLocation L = PathDiagnosticLocation::create(CallExitLoc, SM); - return std::make_shared<PathDiagnosticEventPiece>(L, os.str()); + return std::make_shared<PathDiagnosticEventPiece>(L, sbuf); } /// Annotate the parameter at the analysis entry point. @@ -446,7 +446,7 @@ annotateStartParameter(const ExplodedNode *N, SymbolRef Sym, assert(CurrT->getCount() == 0); os << "0"; } - return std::make_shared<PathDiagnosticEventPiece>(L, os.str()); + return std::make_shared<PathDiagnosticEventPiece>(L, s); } PathDiagnosticPieceRef @@ -493,7 +493,7 @@ RefCountReportVisitor::VisitNode(const ExplodedNode *N, BugReporterContext &BRC, if (PrevT && IsFreeUnowned && CurrV.isNotOwned() && PrevT->isOwned()) { os << "Object is now not exclusively owned"; auto Pos = PathDiagnosticLocation::create(N->getLocation(), SM); - return std::make_shared<PathDiagnosticEventPiece>(Pos, os.str()); + return std::make_shared<PathDiagnosticEventPiece>(Pos, sbuf); } // This is the allocation site since the previous node had no bindings @@ -535,7 +535,7 @@ RefCountReportVisitor::VisitNode(const ExplodedNode *N, BugReporterContext &BRC, } PathDiagnosticLocation Pos(S, SM, N->getLocationContext()); - return std::make_shared<PathDiagnosticEventPiece>(Pos, os.str()); + return std::make_shared<PathDiagnosticEventPiece>(Pos, sbuf); } // Gather up the effects that were performed on the object at this @@ -582,13 +582,13 @@ RefCountReportVisitor::VisitNode(const ExplodedNode *N, BugReporterContext &BRC, if (!shouldGenerateNote(os, PrevT, CurrV, DeallocSent)) return nullptr; - if (os.str().empty()) + if (sbuf.empty()) return nullptr; // We have nothing to say! const Stmt *S = N->getLocation().castAs<StmtPoint>().getStmt(); PathDiagnosticLocation Pos(S, BRC.getSourceManager(), N->getLocationContext()); - auto P = std::make_shared<PathDiagnosticEventPiece>(Pos, os.str()); + auto P = std::make_shared<PathDiagnosticEventPiece>(Pos, sbuf); // Add the range by scanning the children of the statement for any bindings // to Sym. @@ -831,7 +831,7 @@ RefLeakReportVisitor::getEndPath(BugReporterContext &BRC, << RV->getCount(); } - return std::make_shared<PathDiagnosticEventPiece>(L, os.str()); + return std::make_shared<PathDiagnosticEventPiece>(L, sbuf); } RefCountReport::RefCountReport(const RefCountBug &D, const LangOptions &LOpts, diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index c1a8aad83a90b..977deb3182deb 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -3900,7 +3900,7 @@ struct DOTGraphTraits<ExplodedGraph*> : public DefaultDOTGraphTraits { State->printDOT(Out, N->getLocationContext(), Space); Out << "\\l}\\l"; - return Out.str(); + return Buf; } }; diff --git a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp index d8c257dbd731e..fab8e35962d75 100644 --- a/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp @@ -3283,7 +3283,7 @@ static std::string toString(const SymbolRef &Sym) { std::string S; llvm::raw_string_ostream O(S); Sym->dumpToStream(O); - return O.str(); + return S; } void RangeConstraintManager::printConstraints(raw_ostream &Out, @@ -3354,7 +3354,7 @@ static std::string toString(ProgramStateRef State, EquivalenceClass Class) { Out << "\"" << ClassMember << "\""; } Out << " ]"; - return Out.str(); + return Str; } void RangeConstraintManager::printEquivalenceClasses(raw_ostream &Out, diff --git a/clang/lib/StaticAnalyzer/Core/SVals.cpp b/clang/lib/StaticAnalyzer/Core/SVals.cpp index 0e1351215bb42..291e4fa752a8f 100644 --- a/clang/lib/StaticAnalyzer/Core/SVals.cpp +++ b/clang/lib/StaticAnalyzer/Core/SVals.cpp @@ -271,7 +271,7 @@ void SVal::printJson(raw_ostream &Out, bool AddQuotes) const { dumpToStream(TempOut); - Out << JsonFormat(TempOut.str(), AddQuotes); + Out << JsonFormat(Buf, AddQuotes); } void SVal::dumpToStream(raw_ostream &os) const { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits