Skip to content

Commit 5c3b69f

Browse files
authored
Fix 10496: crash: endless recursion (symbolDatabaseCreateExprId => isSameExpr => isSameExpr ...) (cppcheck-opensource#3467)
1 parent 2ee920d commit 5c3b69f

2 files changed

Lines changed: 14 additions & 3 deletions

File tree

lib/astutils.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,9 @@ bool astHasToken(const Token* root, const Token * tok)
169169
{
170170
if (!root)
171171
return false;
172-
if (root == tok)
173-
return true;
174-
return astHasToken(root->astOperand1(), tok) || astHasToken(root->astOperand2(), tok);
172+
while (tok->astParent() && tok != root)
173+
tok = tok->astParent();
174+
return root == tok;
175175
}
176176

177177
bool astHasVar(const Token * tok, nonneg int varid)
@@ -833,6 +833,8 @@ std::vector<ReferenceToken> followAllReferences(const Token* tok,
833833
errors.emplace_back(var->declEndToken(), "Passed to reference.");
834834
return {{tok, std::move(errors)}};
835835
} else if (Token::simpleMatch(var->declEndToken(), "=")) {
836+
if (astHasToken(var->declEndToken(), tok))
837+
return std::vector<ReferenceToken>{};
836838
errors.emplace_back(var->declEndToken(), "Assigned to reference.");
837839
const Token *vartok = var->declEndToken()->astOperand2();
838840
if (vartok == tok || (!temporary && isTemporary(true, vartok, nullptr, true) &&

test/testtokenize.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ class TestTokenizer : public TestFixture {
409409
TEST_CASE(checkIfCppCast);
410410
TEST_CASE(checkRefQualifiers);
411411
TEST_CASE(checkConditionBlock);
412+
TEST_CASE(checkUnknownCircularVar);
412413

413414
// #9052
414415
TEST_CASE(noCrash1);
@@ -6845,6 +6846,14 @@ class TestTokenizer : public TestFixture {
68456846
"}\n"));
68466847
}
68476848

6849+
void checkUnknownCircularVar()
6850+
{
6851+
ASSERT_NO_THROW(tokenizeAndStringify("void execute() {\n"
6852+
" const auto &bias = GEMM_CTX_ARG_STORAGE(bias);\n"
6853+
" auto &c = GEMM_CTX_ARG_STORAGE(c);\n"
6854+
"}\n"));
6855+
}
6856+
68486857
void noCrash1() {
68496858
ASSERT_NO_THROW(tokenizeAndStringify(
68506859
"struct A {\n"

0 commit comments

Comments
 (0)