Merge pull request #2712 from jubnzv/fix-9774

Fixed crash on garbage code: comparisson with empty second operand
This commit is contained in:
Daniel Marjamäki 2020-07-18 09:54:15 +02:00 committed by GitHub
commit ce64fa9eb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 7 deletions

View File

@ -9624,11 +9624,16 @@ void Tokenizer::findGarbageCode() const
if (match1 && match2) if (match1 && match2)
syntaxError(tok); syntaxError(tok);
} }
if (Token::Match(tok, "%or%|%oror%|~|^|!|%comp%|+|-|/|% )|]|}")) { if (Token::Match(tok, "%or%|%oror%|~|^|!|%comp%|+|-|/|%")) {
if (isC()) std::string code = "";
syntaxError(tok, tok->str() + tok->next()->str()); if (Token::Match(tok->next(), ")|]|}"))
if (tok->str() != ">" && !Token::simpleMatch(tok->previous(), "operator")) code = tok->str() + tok->next()->str();
syntaxError(tok, tok->str() + " " + tok->next()->str()); if (Token::simpleMatch(tok->next(), "( )"))
code = tok->str() + "()";
if (!code.empty()) {
if (isC() || (tok->str() != ">" && !Token::simpleMatch(tok->previous(), "operator")))
syntaxError(tok, code);
}
} }
if (Token::Match(tok, "%num%|%bool%|%char%|%str% %num%|%bool%|%char%|%str%") && !Token::Match(tok, "%str% %str%")) if (Token::Match(tok, "%num%|%bool%|%char%|%str% %num%|%bool%|%char%|%str%") && !Token::Match(tok, "%str% %str%"))
syntaxError(tok); syntaxError(tok);

View File

@ -1402,7 +1402,7 @@ private:
void garbageCode164() { void garbageCode164() {
//7234 //7234
checkCode("class d{k p;}(){d::d():B<()}"); ASSERT_THROW(checkCode("class d{k p;}(){d::d():B<()}"), InternalError);
} }
void garbageCode165() { void garbageCode165() {

View File

@ -8087,7 +8087,7 @@ private:
ASSERT_THROW(tokenizeAndStringify("void foo() { for_chain( if (!done) done = 1); }"), InternalError); ASSERT_THROW(tokenizeAndStringify("void foo() { for_chain( if (!done) done = 1); }"), InternalError);
ASSERT_THROW(tokenizeAndStringify("void foo() { for_chain( a, b, if (!done) done = 1); }"), InternalError); ASSERT_THROW(tokenizeAndStringify("void foo() { for_chain( a, b, if (!done) done = 1); }"), InternalError);
ASSERT_THROW_EQUALS(tokenizeAndStringify("void f() { if (retval==){} }"), InternalError, "syntax error: == )"); ASSERT_THROW_EQUALS(tokenizeAndStringify("void f() { if (retval==){} }"), InternalError, "syntax error: ==)");
// after (expr) // after (expr)
ASSERT_NO_THROW(tokenizeAndStringify("void f() { switch (a) int b; }")); ASSERT_NO_THROW(tokenizeAndStringify("void f() { switch (a) int b; }"));
@ -8108,6 +8108,9 @@ private:
// Ticket #9664 // Ticket #9664
ASSERT_NO_THROW(tokenizeAndStringify("S s = { .x { 2 }, .y[0] { 3 } };")); ASSERT_NO_THROW(tokenizeAndStringify("S s = { .x { 2 }, .y[0] { 3 } };"));
ASSERT_THROW_EQUALS(tokenizeAndStringify("void f() { assert(a==()); }"), InternalError, "syntax error: ==()");
ASSERT_THROW_EQUALS(tokenizeAndStringify("void f() { assert(a+()); }"), InternalError, "syntax error: +()");
} }