[llvm-branch-commits] [clang] release/21.x: [Analysis] Prevent revisiting block when searching for noreturn vars (#150582) (PR #151381)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 30 12:20:32 PDT 2025
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/151381
Backport 330b40e11fd20e9a29b9c24de17e4ba23afeedc6
Requested by: @pawosm-arm
>From f0b310b07873d3a21ab8f9f0ca137e876fc0f4ec Mon Sep 17 00:00:00 2001
From: Serge Pavlov <sepavloff at gmail.com>
Date: Wed, 30 Jul 2025 20:40:07 +0700
Subject: [PATCH] [Analysis] Prevent revisiting block when searching for
noreturn vars (#150582)
When searching for noreturn variable initializations, do not visit CFG
blocks that are already visited, it prevents hanging the analysis.
It must fix https://github.com/llvm/llvm-project/issues/150336.
(cherry picked from commit 330b40e11fd20e9a29b9c24de17e4ba23afeedc6)
---
clang/lib/Sema/AnalysisBasedWarnings.cpp | 4 ++++
clang/test/SemaCXX/noreturn-weverything.c | 15 +++++++++++++++
2 files changed, 19 insertions(+)
create mode 100644 clang/test/SemaCXX/noreturn-weverything.c
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index 5e75c64eb2b9a..85ac3c06ec2c2 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -503,8 +503,12 @@ static bool areAllValuesNoReturn(const VarDecl *VD, const CFGBlock &VarBlk,
TransferFunctions TF(VD);
BackwardDataflowWorklist Worklist(*AC.getCFG(), AC);
+ llvm::DenseSet<const CFGBlock *> Visited;
Worklist.enqueueBlock(&VarBlk);
while (const CFGBlock *B = Worklist.dequeue()) {
+ if (Visited.contains(B))
+ continue;
+ Visited.insert(B);
// First check the current block.
for (CFGBlock::const_reverse_iterator ri = B->rbegin(), re = B->rend();
ri != re; ++ri) {
diff --git a/clang/test/SemaCXX/noreturn-weverything.c b/clang/test/SemaCXX/noreturn-weverything.c
new file mode 100644
index 0000000000000..92a587d395639
--- /dev/null
+++ b/clang/test/SemaCXX/noreturn-weverything.c
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -fsyntax-only %s -Weverything
+
+void free(void *);
+typedef void (*set_free_func)(void *);
+struct Method {
+ int nparams;
+ int *param;
+};
+void selelem_free_method(struct Method* method, void* data) {
+ set_free_func free_func = 0;
+ for (int i = 0; i < method->nparams; ++i)
+ free(&method->param[i]);
+ if (data && free_func)
+ free_func(data);
+}
More information about the llvm-branch-commits
mailing list