Fixed #8211 (Crash on incomplete code in isVariableChanged ())

This commit is contained in:
Daniel Marjamäki 2017-09-11 13:45:36 +02:00
parent 9f4fc7b323
commit 56544ac936
2 changed files with 21 additions and 1 deletions

View File

@ -457,7 +457,7 @@ bool isVariableChanged(const Token *start, const Token *end, const unsigned int
if (Token::simpleMatch(shr->astParent(), ">>"))
return true;
const Token *lhs = shr->astOperand1();
if (!lhs->valueType() || !lhs->valueType()->isIntegral())
if (!lhs || !lhs->valueType() || !lhs->valueType()->isIntegral())
return true;
}

View File

@ -34,6 +34,7 @@ private:
void run() {
TEST_CASE(isReturnScope);
TEST_CASE(isVariableChanged);
}
bool isReturnScope(const char code[], int offset) {
@ -54,6 +55,25 @@ private:
ASSERT_EQUALS(true, isReturnScope("void f() { if (a) { {throw new string(x);}; } }", -4)); // #7144
ASSERT_EQUALS(true, isReturnScope("void f() { if (a) { {throw new string(x);}; } }", -2)); // #7144
}
bool isVariableChanged(const char code[], const char startPattern[], const char endPattern[]) {
Settings settings;
Tokenizer tokenizer(&settings, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
const Token * const tok1 = Token::findsimplematch(tokenizer.tokens(), startPattern);
const Token * const tok2 = Token::findsimplematch(tokenizer.tokens(), endPattern);
return ::isVariableChanged(tok1,tok2,1,false,&settings);
}
void isVariableChanged() {
// #8211 - no lhs for >> , do not crash
ASSERT_EQUALS(true,
isVariableChanged("void f() {\n"
" int b;\n"
" if (b) { (int)((INTOF(8))result >> b); }\n"
"}", "if", "}"));
}
};
REGISTER_TEST(TestAstUtils)