diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 7b9b98bd9..5c726daa4 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -131,9 +131,13 @@ struct ForwardTraversal { // If we are in a loop then jump to the end if (out) *out = loopEnds.back(); - } else if (Token::Match(tok, "return|throw") || isEscapeFunction(tok, &settings->library)) { - traverseRecursive(tok->astOperand1(), f, traverseUnknown); + } else if (Token::Match(tok, "return|throw")) { traverseRecursive(tok->astOperand2(), f, traverseUnknown); + traverseRecursive(tok->astOperand1(), f, traverseUnknown); + return Break(Analyzer::Terminate::Escape); + } else if (Token::Match(tok, "%name% (") && isEscapeFunction(tok, &settings->library)) { + // Traverse the parameters of the function before escaping + traverseRecursive(tok->next()->astOperand2(), f, traverseUnknown); return Break(Analyzer::Terminate::Escape); } else if (isUnevaluated(tok)) { if (out) diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index fc646b711..fcb732f04 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -3472,6 +3472,12 @@ private: " if (x == 42) {}\n" "}"; ASSERT_EQUALS(false, testValueOfX(code, 6U, 11)); + + code = "void f() {\n" + " int x = 1;\n" + " exit(x);\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXKnown(code, 3U, 1)); } void valueFlowForwardTernary() {