https://github.com/steakhal created 
https://github.com/llvm/llvm-project/pull/211517

Several checkers and ExprEngine declare a ProgramStateRef local that is never 
read (typically `State = C.getState();` immediately followed by code that 
re-fetches the state directly). These are not flagged by -Wunused-variable 
because ProgramStateRef has a non-trivial destructor.

Found with a clang-query matcher over clang/lib/StaticAnalyzer.
Assisted-by: claude

From 5e5cab6b3e74f21fbed5194c8c79ea51b9847be0 Mon Sep 17 00:00:00 2001
From: Balazs Benics <[email protected]>
Date: Wed, 22 Jul 2026 15:39:34 +0100
Subject: [PATCH] [analyzer][NFC] Remove unused ProgramStateRef local variables

Several checkers and ExprEngine declare a ProgramStateRef local that is
never read (typically `State = C.getState();` immediately followed by code
that re-fetches the state directly). These are not flagged by
-Wunused-variable because ProgramStateRef has a non-trivial destructor.

Found with a clang-query matcher over clang/lib/StaticAnalyzer.
Assisted-by: claude
---
 clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp | 1 -
 clang/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp     | 2 --
 clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp             | 1 -
 clang/lib/StaticAnalyzer/Checkers/ObjCSuperDeallocChecker.cpp   | 2 --
 clang/lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp       | 1 -
 clang/lib/StaticAnalyzer/Checkers/VAListChecker.cpp             | 1 -
 clang/lib/StaticAnalyzer/Core/ExprEngine.cpp                    | 1 -
 7 files changed, 9 deletions(-)

diff --git a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp 
b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
index 9081e977a099c..bbc597db33c90 100644
--- a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
@@ -425,7 +425,6 @@ static const char* GetCFNumberTypeStr(uint64_t i) {
 
 void CFNumberChecker::checkPreStmt(const CallExpr *CE,
                                          CheckerContext &C) const {
-  ProgramStateRef state = C.getState();
   const FunctionDecl *FD = C.getCalleeDecl(CE);
   if (!FD)
     return;
diff --git a/clang/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp
index 8a5c205b6efba..93e3e3ca2322a 100644
--- a/clang/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp
@@ -456,8 +456,6 @@ void ExprInspectionChecker::analyzerDenote(const CallExpr 
*CE,
     return;
   }
 
-  ProgramStateRef State = C.getState();
-
   C.addTransition(C.getState()->set<DenotedSymbols>(Sym, E));
 }
 
diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
index df911f3ce3d0e..32c767d89dd55 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
@@ -3554,7 +3554,6 @@ void MallocChecker::checkEscapeOnReturn(const ReturnStmt 
*S,
     return;
 
   // Check if we are returning a symbol.
-  ProgramStateRef State = C.getState();
   SVal RetVal = C.getSVal(E);
   SymbolRef Sym = RetVal.getAsSymbol();
   if (!Sym)
diff --git a/clang/lib/StaticAnalyzer/Checkers/ObjCSuperDeallocChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/ObjCSuperDeallocChecker.cpp
index aaa8a77ae6b18..9df070b98fe66 100644
--- a/clang/lib/StaticAnalyzer/Checkers/ObjCSuperDeallocChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/ObjCSuperDeallocChecker.cpp
@@ -242,8 +242,6 @@ SuperDeallocBRVisitor::VisitNode(const ExplodedNode *Succ,
   if (Satisfied)
     return nullptr;
 
-  ProgramStateRef State = Succ->getState();
-
   bool CalledNow =
       Succ->getState()->contains<CalledSuperDealloc>(ReceiverSymbol);
   bool CalledBefore =
diff --git a/clang/lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp
index f2fc9219912ad..5d10c9603fd88 100644
--- a/clang/lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp
@@ -168,7 +168,6 @@ void PointerArithChecker::reportPointerArithMisuse(const 
Expr *E,
   if (SR.isInvalid())
     return;
 
-  ProgramStateRef State = C.getState();
   const MemRegion *Region = C.getSVal(E).getAsRegion();
   if (!Region)
     return;
diff --git a/clang/lib/StaticAnalyzer/Checkers/VAListChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/VAListChecker.cpp
index c1ac601569dfc..09197a85e439c 100644
--- a/clang/lib/StaticAnalyzer/Checkers/VAListChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/VAListChecker.cpp
@@ -197,7 +197,6 @@ const MemRegion *VAListChecker::getVAListAsRegion(SVal SV, 
const Expr *E,
 
 void VAListChecker::checkPreStmt(const VAArgExpr *VAA,
                                  CheckerContext &C) const {
-  ProgramStateRef State = C.getState();
   const Expr *ArgExpr = VAA->getSubExpr();
   const MemRegion *VAList = getVAListAsRegion(C.getSVal(ArgExpr), ArgExpr, C);
   if (!VAList)
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp 
b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
index 678b07ebba1b0..7669b65818272 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
@@ -2664,7 +2664,6 @@ assumeCondition(const Stmt *ConditionStmt, ExplodedNode 
*N) {
 
   DefinedSVal V = X.castAs<DefinedSVal>();
 
-  ProgramStateRef StTrue, StFalse;
   return State->assume(V);
 }
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to