[clang] fdfd37c - [clang][analyzer] Diagnose dead stores on parenthesized lvalues (#227176)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 2 07:57:31 PDT 2026
Author: Cristiano Lacerda
Date: 2026-10-02T14:56:48Z
New Revision: fdfd37c0148b6186c19cc9ffa3f2cbfeb2948533
URL: https://github.com/llvm/llvm-project/commit/fdfd37c0148b6186c19cc9ffa3f2cbfeb2948533
DIFF: https://github.com/llvm/llvm-project/commit/fdfd37c0148b6186c19cc9ffa3f2cbfeb2948533.diff
LOG: [clang][analyzer] Diagnose dead stores on parenthesized lvalues (#227176)
This commit fixes that `deadcode.DeadStores` previously failed to diagnose a
dead store when the assigned variable is wrapped in parentheses.
```c
int f(int input) {
int value;
(value) = input;
value = 2;
return value;
}
```
This change was made with assistance of an AI tool (OpenAI Codex), which
implemented the fix (IgnoreParens()) and the test.
I have found the false negative myself (on a real codebase that uses a
code generator) and ran the tests manually.
Added:
Modified:
clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
clang/test/Analysis/dead-stores.c
Removed:
################################################################################
diff --git a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
index 0d693a3e3ff3dd..c68ee72a9dbda5 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
@@ -325,7 +325,7 @@ class DeadStoreObs : public LiveVariables::Observer {
if (const BinaryOperator* B = dyn_cast<BinaryOperator>(S)) {
if (!B->isAssignmentOp()) return; // Skip non-assignments.
- if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(B->getLHS()))
+ if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(B->getLHS()->IgnoreParens()))
if (VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) {
// Special case: check for assigning null to a pointer.
// This is a common form of defensive programming.
diff --git a/clang/test/Analysis/dead-stores.c b/clang/test/Analysis/dead-stores.c
index 1e9f230415163f..05e7566fc9b5a0 100644
--- a/clang/test/Analysis/dead-stores.c
+++ b/clang/test/Analysis/dead-stores.c
@@ -660,3 +660,20 @@ int rdar34122265_test_nested(int input) {
}
return bar.x.x + bar.y.y;
}
+
+// Parentheses on the left-hand side must not hide a dead store.
+long long dead_store_to_parenthesized_variable(int input) {
+ int foo;
+ long long bar;
+ long baz;
+ (bar) = input;
+ // non-nested-warning at -1 {{Value stored to 'bar' is never read}}
+ (foo) = input;
+ // non-nested-warning at -1 {{Value stored to 'foo' is never read}}
+ (baz) = input;
+ // non-nested-warning at -1 {{Value stored to 'baz' is never read}}
+ bar = 2;
+ foo = 2;
+ baz = 2;
+ return bar + foo + baz;
+}
More information about the cfe-commits
mailing list