From f15f8514f67cc678a04f42a70bac5c762108c406 Mon Sep 17 00:00:00 2001 From: PKEuS Date: Mon, 9 Nov 2015 17:25:20 +0100 Subject: [PATCH] Fixed crash on garbage code (#7120) --- lib/checkother.cpp | 4 ++-- test/testgarbage.cpp | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 1f811bde4..8b292958e 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -517,7 +517,7 @@ void CheckOther::checkRedundantAssignment() } std::map::iterator it = varAssignments.find(tok->varId()); - if (tok->next()->isAssignmentOp() && Token::Match(startToken, "[;{}]")) { // Assignment + if (tok->next() && tok->next()->isAssignmentOp() && Token::Match(startToken, "[;{}]")) { // Assignment if (it != varAssignments.end()) { bool error = true; // Ensure that variable is not used on right side for (const Token* tok2 = tok->tokAt(2); tok2; tok2 = tok2->next()) { @@ -550,7 +550,7 @@ void CheckOther::checkRedundantAssignment() varAssignments[tok->varId()] = tok; memAssignments.erase(tok->varId()); eraseMemberAssignments(tok->varId(), membervars, varAssignments); - } else if (tok->next()->tokType() == Token::eIncDecOp || (tok->previous()->tokType() == Token::eIncDecOp && tok->strAt(1) == ";")) { // Variable incremented/decremented; Prefix-Increment is only suspicious, if its return value is unused + } else if (tok->next() && tok->next()->tokType() == Token::eIncDecOp || (tok->previous()->tokType() == Token::eIncDecOp && tok->strAt(1) == ";")) { // Variable incremented/decremented; Prefix-Increment is only suspicious, if its return value is unused varAssignments[tok->varId()] = tok; memAssignments.erase(tok->varId()); eraseMemberAssignments(tok->varId(), membervars, varAssignments); diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index cbcf28d56..647d9e5ec 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -204,6 +204,7 @@ private: TEST_CASE(garbageCode153); TEST_CASE(garbageCode154); // #7112 TEST_CASE(garbageCode155); // #7118 + TEST_CASE(garbageCode156); // #7120 TEST_CASE(garbageValueFlow); TEST_CASE(garbageSymbolDatabase); @@ -1227,6 +1228,10 @@ private: checkCode("&p(!{}e x){({(0?:?){({})}()})}"); } + void garbageCode156() { // #7120 + checkCode("struct {}a; d f() { c ? : } {}a.p"); + } + void garbageValueFlow() { // #6089 const char* code = "{} int foo(struct, x1, struct x2, x3, int, x5, x6, x7)\n"