Validate asserts in the AST to fix crash in 10442 (#3428)

This commit is contained in:
Paul Fultz II 2021-08-29 13:45:31 -05:00 committed by GitHub
parent 786700efd6
commit 49df3d811a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 6 deletions

View File

@ -1663,8 +1663,8 @@ void TokenList::validateAst() const
throw InternalError(tok, "Syntax Error: AST broken, binary operator '" + tok->str() + "' doesn't have two operands.", InternalError::AST); throw InternalError(tok, "Syntax Error: AST broken, binary operator '" + tok->str() + "' doesn't have two operands.", InternalError::AST);
} }
// Check control blocks // Check control blocks and asserts
if (Token::Match(tok->previous(), "if|while|for|switch (")) { if (Token::Match(tok->previous(), "if|while|for|switch|assert|ASSERT (")) {
if (!tok->astOperand1() || !tok->astOperand2()) if (!tok->astOperand1() || !tok->astOperand2())
throw InternalError(tok, throw InternalError(tok,
"Syntax Error: AST broken, '" + tok->previous()->str() + "Syntax Error: AST broken, '" + tok->previous()->str() +

View File

@ -136,7 +136,7 @@ private:
" void Foo();\n" " void Foo();\n"
"};\n" "};\n"
"void foo(SquarePack s) {\n" "void foo(SquarePack s) {\n"
" assert( s.Foo(); );\n" " assert( s.Foo() );\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:5]: (warning) Assert statement calls a function which may have desired side effects: 'Foo'.\n", errout.str()); ASSERT_EQUALS("[test.cpp:5]: (warning) Assert statement calls a function which may have desired side effects: 'Foo'.\n", errout.str());
@ -144,7 +144,7 @@ private:
" void Foo() const;\n" " void Foo() const;\n"
"};\n" "};\n"
"void foo(SquarePack* s) {\n" "void foo(SquarePack* s) {\n"
" assert( s->Foo(); );\n" " assert( s->Foo() );\n"
"}"); "}");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
@ -152,14 +152,14 @@ private:
" static void Foo();\n" " static void Foo();\n"
"};\n" "};\n"
"void foo(SquarePack* s) {\n" "void foo(SquarePack* s) {\n"
" assert( s->Foo(); );\n" " assert( s->Foo() );\n"
"}"); "}");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
check("struct SquarePack {\n" check("struct SquarePack {\n"
"};\n" "};\n"
"void foo(SquarePack* s) {\n" "void foo(SquarePack* s) {\n"
" assert( s->Foo(); );\n" " assert( s->Foo() );\n"
"}"); "}");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }