[clang] [clang][analyzer] Diagnose dead stores on parenthesized lvalues (PR #227176)
Cristiano Lacerda via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 29 17:15:12 PDT 2026
https://github.com/crisclacerda updated https://github.com/llvm/llvm-project/pull/227176
>From 148d88f88fe8f7ec3e0da9088c5a1b27240b3159 Mon Sep 17 00:00:00 2001
From: Cristiano Lacerda <clacerda.cristiano at gmail.com>
Date: Mon, 28 Sep 2026 22:12:08 -0300
Subject: [PATCH] [clang][analyzer] Diagnose dead stores on parenthesized
lvalues
Ignore parentheses around an assignment left-hand side when identifying a local variable. This lets DeadStores diagnose an overwritten store such as (value) = input.
---
.../Checkers/DeadStoresChecker.cpp | 2 +-
clang/test/Analysis/dead-stores.c | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
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