diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 5bbbf70a0c7..123395b31e3 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2036,6 +2036,8 @@ static const Token *singleMemberCallInScope(const Token *start, nonneg int varid if (!Token::findmatch(dotTok->tokAt(2), "%varid%", endStatement, varid)) return nullptr; input = Token::Match(start->next(), "%var% . %name% ( %varid% )", varid); + if (!dotTok->astOperand1()) // incomplete code + return nullptr; if (isVariableChanged(dotTok->next(), endStatement, dotTok->astOperand1()->varId(), false, nullptr, true)) return nullptr; return dotTok; diff --git a/test/teststl.cpp b/test/teststl.cpp index 99e861144eb..a20691fb549 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -3241,6 +3241,20 @@ class TestStl : public TestFixture { " void shift() { EffectivityRangeData::iterator it; } \n" "};\n"); ASSERT_EQUALS("", errout.str()); + + // test for crash in z3 + check("struct explain::imp {\n" + " solver &m_solver;\n" + "\n" + " void project(var x, unsigned num, literal const *ls,\n" + " const scoped_literal_vector &result) {\n" + " DEBUG_CODE(TRACE(\"nlsat\",\n" + " for (literal l\n" + " : result) { m_solver.display(tout << \" \", l); });\n" + " );\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); } void dereferenceInvalidIterator() {