badBitmaskCheck: Avoid FP when there is #ifdef in expression
This commit is contained in:
parent
13c80d6cce
commit
898ad314ab
|
@ -293,7 +293,7 @@ static bool inBooleanFunction(const Token *tok)
|
|||
|
||||
void CheckCondition::checkBadBitmaskCheck()
|
||||
{
|
||||
if (!mSettings->severity.isEnabled(Severity::warning))
|
||||
if (!mSettings->severity.isEnabled(Severity::style))
|
||||
return;
|
||||
|
||||
for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) {
|
||||
|
@ -311,6 +311,11 @@ void CheckCondition::checkBadBitmaskCheck()
|
|||
if (isBoolean && isTrue)
|
||||
badBitmaskCheckError(tok);
|
||||
|
||||
// If there are #ifdef in the expression don't warn about redundant | to avoid FP
|
||||
const auto& startStop = tok->findExpressionStartEndTokens();
|
||||
if (mTokenizer->hasIfdef(startStop.first, startStop.second))
|
||||
continue;
|
||||
|
||||
const bool isZero1 = (tok->astOperand1()->hasKnownIntValue() && tok->astOperand1()->values().front().intvalue == 0);
|
||||
const bool isZero2 = (tok->astOperand2()->hasKnownIntValue() && tok->astOperand2()->values().front().intvalue == 0);
|
||||
|
||||
|
@ -323,7 +328,7 @@ void CheckCondition::checkBadBitmaskCheck()
|
|||
void CheckCondition::badBitmaskCheckError(const Token *tok, bool isNoOp)
|
||||
{
|
||||
if (isNoOp)
|
||||
reportError(tok, Severity::warning, "badBitmaskCheck", "Operator '|' with one operand equal to zero is redundant.", CWE571, Certainty::normal);
|
||||
reportError(tok, Severity::style, "badBitmaskCheck", "Operator '|' with one operand equal to zero is redundant.", CWE571, Certainty::normal);
|
||||
else
|
||||
reportError(tok, Severity::warning, "badBitmaskCheck", "Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?", CWE571, Certainty::normal);
|
||||
}
|
||||
|
|
|
@ -903,7 +903,7 @@ private:
|
|||
" int j = 0;\n"
|
||||
" if (i | j) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (warning) Operator '|' with one operand equal to zero is redundant.\n", errout.str());
|
||||
ASSERT_EQUALS("[test.cpp:3]: (style) Operator '|' with one operand equal to zero is redundant.\n", errout.str());
|
||||
|
||||
check("#define EIGHTTOIS(x) (((x) << 8) | (x))\n"
|
||||
"int f() {\n"
|
||||
|
@ -916,6 +916,16 @@ private:
|
|||
" *pFd = open(s, O_RDONLY | O_BINARY, 0);\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("const int FEATURE_BITS = x |\n"
|
||||
"#if FOO_ENABLED\n"
|
||||
" FEATURE_FOO |\n"
|
||||
"#endif\n"
|
||||
"#if BAR_ENABLED\n"
|
||||
" FEATURE_BAR |\n"
|
||||
"#endif\n"
|
||||
" 0;");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue