https://github.com/NagyDonat created https://github.com/llvm/llvm-project/pull/187554
Previously it took an `Stmt*`, which was unnecessary and confusing. Binding values to non-expression statements is AFAIK nonsense. This is a WIP patch that compiles and passes the tests, but still needs some more thinking. From cf2fbd086609a959dc4991a0d83e062088dfdf96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Don=C3=A1t=20Nagy?= <[email protected]> Date: Thu, 19 Mar 2026 19:49:31 +0100 Subject: [PATCH] [analyzer] Let ProgramState::BindExpr take an Expr* Previously it took an `Stmt*`, which was unnecessary and confusing. Binding values to non-expression statements is AFAIK nonsense. This is a WIP patch that compiles and passes the tests, but still needs some more thinking. --- .../Core/PathSensitive/ProgramState.h | 2 +- clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 19 +++++++++++-------- .../Core/ExprEngineCallAndReturn.cpp | 3 ++- .../lib/StaticAnalyzer/Core/ProgramState.cpp | 6 +++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index d3dd6ca124b7f..adcb9c86ab1fa 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -280,7 +280,7 @@ class ProgramState : public llvm::FoldingSetNode { /// Create a new state by binding the value 'V' to the statement 'S' in the /// state's environment. - [[nodiscard]] ProgramStateRef BindExpr(const Stmt *S, + [[nodiscard]] ProgramStateRef BindExpr(const Expr *S, const LocationContext *LCtx, SVal V, bool Invalidate = true) const; diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 30aee25d35dea..50fb3027c0fc8 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1885,7 +1885,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, // GNU __null is a pointer-width integer, not an actual pointer. ProgramStateRef state = Pred->getState(); state = state->BindExpr( - S, Pred->getLocationContext(), + cast<Expr>(S), Pred->getLocationContext(), svalBuilder.makeIntValWithWidth(getContext().VoidPtrTy, 0)); Bldr.generateNode(S, Pred, state); break; @@ -2017,7 +2017,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, const LocationContext *LCtx = Pred->getLocationContext(); for (const auto I : PreVisit) { ProgramStateRef State = I->getState(); - State = State->BindExpr(S, LCtx, *ConstantVal); + State = State->BindExpr(cast<Expr>(S), LCtx, *ConstantVal); if (IsTemporary) State = createTemporaryRegionIfNeeded(State, LCtx, cast<Expr>(S), @@ -2443,13 +2443,15 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, const auto *PE = cast<PseudoObjectExpr>(S); if (const Expr *Result = PE->getResultExpr()) { SVal V = state->getSVal(Result, Pred->getLocationContext()); - Bldr.generateNode(S, Pred, - state->BindExpr(S, Pred->getLocationContext(), V)); + Bldr.generateNode( + S, Pred, + state->BindExpr(cast<Expr>(S), Pred->getLocationContext(), V)); } else Bldr.generateNode(S, Pred, - state->BindExpr(S, Pred->getLocationContext(), - UnknownVal())); + state->BindExpr(cast<Expr>(S), + Pred->getLocationContext(), + UnknownVal())); Bldr.addNodes(Dst); break; @@ -2464,8 +2466,9 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, const auto *OIE = cast<ObjCIndirectCopyRestoreExpr>(S); const Expr *E = OIE->getSubExpr(); SVal V = state->getSVal(E, Pred->getLocationContext()); - Bldr.generateNode(S, Pred, - state->BindExpr(S, Pred->getLocationContext(), V)); + Bldr.generateNode( + S, Pred, + state->BindExpr(cast<Expr>(S), Pred->getLocationContext(), V)); Bldr.addNodes(Dst); break; } diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp index f6ba3699312ec..4bc3e9261e21e 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -311,7 +311,8 @@ void ExprEngine::processCallExit(ExplodedNode *CEBNode) { } } - State = State->BindExpr(CE, CallerCtx, V); + if (const auto *CEExpr = dyn_cast<Expr>(CE)) + State = State->BindExpr(CEExpr, CallerCtx, V); } // Bind the constructed object value to CXXConstructExpr. diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp index 87485daa6e5c9..8df5ad11f4c87 100644 --- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -298,9 +298,9 @@ SVal ProgramState::getSVal(Loc location, QualType T) const { return V; } -ProgramStateRef ProgramState::BindExpr(const Stmt *S, - const LocationContext *LCtx, - SVal V, bool Invalidate) const{ +ProgramStateRef ProgramState::BindExpr(const Expr *S, + const LocationContext *LCtx, SVal V, + bool Invalidate) const { Environment NewEnv = getStateManager().EnvMgr.bindExpr(Env, EnvironmentEntry(S, LCtx), V, Invalidate); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
