From 3625d179e53e07d2f207075b6741912db9c6f7ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 11 Jan 2014 21:10:01 +0100 Subject: [PATCH] value flow: don't perform value flow analysis in sizeof/typeof expressions --- lib/valueflow.cpp | 4 ++++ test/testvalueflow.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 13e9a6603..ed85f5d3f 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -227,6 +227,10 @@ static void valueFlowBeforeCondition(TokenList *tokenlist, ErrorLogger *errorLog break; } + // skip sizeof.. + if (tok2->str() == ")" && Token::Match(tok2->link()->previous(), "typeof|sizeof (")) + tok2 = tok2->link(); + if (tok2->str() == "}") { if (Token::findmatch(tok2->link(), "%varid%", tok2, varid)) { if (settings->debugwarnings) diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 683d82634..0eaab11f8 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -182,6 +182,13 @@ private: "}"; ASSERT_EQUALS(true, testValueOfX(code, 2U, 123)); + // skip sizeof + code = "void f(int *x) {\n" + " sizeof(x[0]);\n" + " if (x==63){}\n" + "}"; + ASSERT_EQUALS(false, testValueOfX(code, 2U, 63)); + // bailout: if/else/etc bailout("void f(int x) {\n" " if (x != 123) { b = x; }\n"