Skip to content

Commit 2a480a3

Browse files
committed
[Analysis] Prevent revisiting block when searching for noreturn vars
When searching for noreturn variable initializations, do not visit CFG blocks that are already visited, it prevents hanging the analysis. It must fix Ihttps://github.com//issues/150336.
1 parent e9259a4 commit 2a480a3

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

clang/lib/Sema/AnalysisBasedWarnings.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,12 @@ static bool areAllValuesNoReturn(const VarDecl *VD, const CFGBlock &VarBlk,
503503

504504
TransferFunctions TF(VD);
505505
BackwardDataflowWorklist Worklist(*AC.getCFG(), AC);
506+
llvm::DenseSet<const CFGBlock *> Visited;
506507
Worklist.enqueueBlock(&VarBlk);
507508
while (const CFGBlock *B = Worklist.dequeue()) {
509+
if (Visited.contains(B))
510+
continue;
511+
Visited.insert(B);
508512
// First check the current block.
509513
for (CFGBlock::const_reverse_iterator ri = B->rbegin(), re = B->rend();
510514
ri != re; ++ri) {

clang/test/SemaCXX/noreturn-vars.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,3 +225,20 @@ extern void abc_02(func_type *);
225225
abc_02(&func_ptr);
226226
func_ptr();
227227
} // expected-warning {{function declared 'noreturn' should not return}}
228+
229+
namespace Issue150336 {
230+
void free(void *);
231+
typedef void (*sel_freefunc)(void *);
232+
struct gmx_ana_selmethod_t {
233+
sel_freefunc free;
234+
int nparams;
235+
int *param;
236+
};
237+
void gmx_selelem_free_method(struct gmx_ana_selmethod_t* method, void* mdata) {
238+
sel_freefunc free_func = 0;
239+
for (int i = 0; i < method->nparams; ++i)
240+
free(&method->param[i]);
241+
if (mdata && free_func)
242+
free_func(mdata);
243+
}
244+
}

0 commit comments

Comments
 (0)