Merge pull request #2706 from rikardfalkeborn/condition-fn-with-sizeof
Fix FN with known condition and sizeof
This commit is contained in:
commit
33557012a1
|
@ -1457,6 +1457,7 @@ void CheckCondition::alwaysTrueFalse()
|
||||||
|
|
||||||
// don't warn when condition checks sizeof result
|
// don't warn when condition checks sizeof result
|
||||||
bool hasSizeof = false;
|
bool hasSizeof = false;
|
||||||
|
bool hasNonNumber = false;
|
||||||
tokens.push(tok);
|
tokens.push(tok);
|
||||||
while (!tokens.empty()) {
|
while (!tokens.empty()) {
|
||||||
const Token *tok2 = tokens.top();
|
const Token *tok2 = tokens.top();
|
||||||
|
@ -1473,9 +1474,9 @@ void CheckCondition::alwaysTrueFalse()
|
||||||
tokens.push(tok2->astOperand1());
|
tokens.push(tok2->astOperand1());
|
||||||
tokens.push(tok2->astOperand2());
|
tokens.push(tok2->astOperand2());
|
||||||
} else
|
} else
|
||||||
break;
|
hasNonNumber = true;
|
||||||
}
|
}
|
||||||
if (tokens.empty() && hasSizeof)
|
if (!hasNonNumber && hasSizeof)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
alwaysTrueFalseError(tok, &tok->values().front());
|
alwaysTrueFalseError(tok, &tok->values().front());
|
||||||
|
|
|
@ -2987,14 +2987,17 @@ private:
|
||||||
// Avoid FP for sizeof condition
|
// Avoid FP for sizeof condition
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" if (sizeof(char) != 123) {}\n"
|
" if (sizeof(char) != 123) {}\n"
|
||||||
|
" if (123 != sizeof(char)) {}\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" int x = 123;\n"
|
" int x = 123;\n"
|
||||||
" if (sizeof(char) != x) {}\n"
|
" if (sizeof(char) != x) {}\n"
|
||||||
|
" if (x != sizeof(char)) {}\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'sizeof(char)!=x' is always true\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'sizeof(char)!=x' is always true\n"
|
||||||
|
"[test.cpp:4]: (style) Condition 'x!=sizeof(char)' is always true\n", errout.str());
|
||||||
|
|
||||||
// Don't warn in assertions. Condition is often 'always true' by intention.
|
// Don't warn in assertions. Condition is often 'always true' by intention.
|
||||||
// If platform,defines,etc cause an 'always false' assertion then that is not very dangerous neither
|
// If platform,defines,etc cause an 'always false' assertion then that is not very dangerous neither
|
||||||
|
|
Loading…
Reference in New Issue