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 <sepavl...@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); +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits