[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