diff options
author | Fangyi Zhou <me@fangyi.io> | 2025-04-25 09:39:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-25 10:39:45 +0200 |
commit | ec936b3186e3512a9297c5a12b58d627ef1a1b32 (patch) | |
tree | 0c59bbf6f6df0ef42a7407408c51c40f8fc6f1c5 /clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp | |
parent | c4d44ecb98896d1b0919ce064eefa8cae286f55d (diff) | |
download | llvm-ec936b3186e3512a9297c5a12b58d627ef1a1b32.zip llvm-ec936b3186e3512a9297c5a12b58d627ef1a1b32.tar.gz llvm-ec936b3186e3512a9297c5a12b58d627ef1a1b32.tar.bz2 |
[Clang][analyzer] Replace Stmt* with ConstCFGElementRef in SymbolConjured (#128251)
This PR changes the `Stmt *` field in `SymbolConjured` with
`CFGBlock::ConstCFGElementRef`. The motivation is that, when conjuring a
symbol, there might not always be a statement available, causing
information to be lost for conjured symbols, whereas the CFGElementRef
can always be provided at the callsite.
Following the idea, this PR changes callsites of functions to create
conjured symbols, and replaces them with appropriate `CFGElementRef`s.
Closes #57270
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp index 9c0b79a..3628a14 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StdLibraryFunctionsChecker.cpp @@ -585,7 +585,7 @@ class StdLibraryFunctionsChecker CheckerContext &C) const override { SValBuilder &SVB = C.getSValBuilder(); NonLoc ErrnoSVal = - SVB.conjureSymbolVal(&Tag, Call.getOriginExpr(), + SVB.conjureSymbolVal(&Tag, Call.getCFGElementRef(), C.getLocationContext(), C.getASTContext().IntTy, C.blockCount()) .castAs<NonLoc>(); @@ -621,7 +621,7 @@ class StdLibraryFunctionsChecker const Summary &Summary, CheckerContext &C) const override { return errno_modeling::setErrnoStdMustBeChecked(State, C, - Call.getOriginExpr()); + Call.getCFGElementRef()); } const std::string describe(CheckerContext &C) const override { @@ -1482,7 +1482,8 @@ bool StdLibraryFunctionsChecker::evalCall(const CallEvent &Call, const LocationContext *LC = C.getLocationContext(); const auto *CE = cast<CallExpr>(Call.getOriginExpr()); SVal V = C.getSValBuilder().conjureSymbolVal( - CE, LC, CE->getType().getCanonicalType(), C.blockCount()); + Call.getCFGElementRef(), LC, CE->getType().getCanonicalType(), + C.blockCount()); State = State->BindExpr(CE, LC, V); C.addTransition(State); |