From 56544ac936809ffcfe223c232a81695cf8fa4338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 11 Sep 2017 13:45:36 +0200 Subject: [PATCH] Fixed #8211 (Crash on incomplete code in isVariableChanged ()) --- lib/astutils.cpp | 2 +- test/testastutils.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 1cbb20ed5..2257db68a 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -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; } diff --git a/test/testastutils.cpp b/test/testastutils.cpp index 2fb6ef3e3..db3046086 100644 --- a/test/testastutils.cpp +++ b/test/testastutils.cpp @@ -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)