[clang] 0856064 - [clang][StaticAnalyzer] Avoid 'raw_string_ostream::str' (NFC)
Youngsuk Kim via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 2 17:53:29 PDT 2024
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 {
More information about the cfe-commits
mailing list