From 3c2d3ca3a4a197defbaecc56df67922650575c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 26 Mar 2011 12:20:23 +0100 Subject: [PATCH] Fixed #2653 (segmentation fault of cppcheck 'x=b=0;') --- lib/tokenize.cpp | 3 +-- test/testtokenize.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 5b493dfc2..34f0112be 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -6095,7 +6095,6 @@ void Tokenizer::simplifyVariableMultipleAssign() if (Token::Match(tok, "%var% = %var% = %num% ;") || Token::Match(tok, "%var% = %var% = %var% ;")) { - // skip intermediate assignments Token *tok2 = tok->previous(); while (tok2 && @@ -6105,7 +6104,7 @@ void Tokenizer::simplifyVariableMultipleAssign() tok2 = tok2->tokAt(-2); } - if (tok2->str() != ";") + if (!tok2 || tok2->str() != ";") { continue; } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 3d66b3a99..4a57c3dcc 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -326,6 +326,9 @@ private: // Some simple cleanups of unhandled macros in the global scope TEST_CASE(removeMacrosInGlobalScope); + + // a = b = 0; + TEST_CASE(multipleAssignment); } @@ -5618,6 +5621,11 @@ private: // remove some unhandled macros in the global scope. ASSERT_EQUALS("void f ( ) { }", tokenizeAndStringify("void f() NOTHROW { }")); } + + void multipleAssignment() + { + ASSERT_EQUALS("a = b = 0 ;", tokenizeAndStringify("a=b=0;")); + } }; REGISTER_TEST(TestTokenizer)