Refactorized CheckCondition::clarifyCondition():
- Reimplemented parts of the check based on ValueType - Merged two loops Fixed some type conversion messages
This commit is contained in:
parent
0bf85f9aa5
commit
3366a74bb0
|
@ -905,48 +905,14 @@ void CheckCondition::clarifyCondition()
|
|||
} else if (!tok2->isName() && !tok2->isNumber() && tok2->str() != ".")
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// using boolean result in bitwise operation ! x [&|^]
|
||||
for (std::size_t i = 0; i < functions; ++i) {
|
||||
const Scope * scope = symbolDatabase->functionScopes[i];
|
||||
for (const Token* tok = scope->classStart->next(); tok != scope->classEnd; tok = tok->next()) {
|
||||
if (Token::Match(tok, "%comp%|!")) {
|
||||
if (tok->link()) // don't write false positives when templates are used
|
||||
continue;
|
||||
|
||||
const Token *tok2 = tok->next();
|
||||
|
||||
// Todo: There are false positives if '(' if encountered. It
|
||||
// is assumed there is something like '(char *)&..' and therefore
|
||||
// it bails out.
|
||||
if (Token::Match(tok2, "(|&"))
|
||||
continue;
|
||||
|
||||
while (tok2 && (tok2->isName() || tok2->isNumber() || Token::Match(tok2, ".|(|["))) {
|
||||
if (Token::Match(tok2, "(|["))
|
||||
tok2 = tok2->link();
|
||||
tok2 = tok2->next();
|
||||
}
|
||||
|
||||
if (Token::Match(tok2, "[&|^]")) {
|
||||
// don't write false positives when templates are used
|
||||
if (Token::Match(tok2, "&|* ,|>") || Token::simpleMatch(tok2->previous(), "const &"))
|
||||
continue;
|
||||
|
||||
// #3609 - CWinTraits<WS_CHILD|WS_VISIBLE>::..
|
||||
if (!isC && Token::Match(tok->previous(), "%name% <")) {
|
||||
const Token *tok3 = tok2;
|
||||
while (Token::Match(tok3, "[&|^] %name%"))
|
||||
tok3 = tok3->tokAt(2);
|
||||
if (Token::Match(tok3, ",|>"))
|
||||
continue;
|
||||
}
|
||||
|
||||
} else if (tok->tokType() == Token::eBitOp) {
|
||||
// using boolean result in bitwise operation ! x [&|^]
|
||||
const ValueType* vt1 = tok->astOperand1() ? tok->astOperand1()->valueType() : nullptr;
|
||||
const ValueType* vt2 = tok->astOperand2() ? tok->astOperand2()->valueType() : nullptr;
|
||||
if (vt1 && vt1->type == ValueType::BOOL)
|
||||
clarifyConditionError(tok, false, true);
|
||||
else if (vt2 && vt2->type == ValueType::BOOL)
|
||||
clarifyConditionError(tok, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4427,7 +4427,7 @@ std::string ValueType::str() const
|
|||
ret += " double";
|
||||
else if (type == LONGDOUBLE)
|
||||
ret += " long double";
|
||||
for (int p = 0; p < pointer; p++) {
|
||||
for (unsigned int p = 0; p < pointer; p++) {
|
||||
ret += " *";
|
||||
if (constness & (2 << p))
|
||||
ret += " const";
|
||||
|
|
|
@ -3278,7 +3278,7 @@ bool Tokenizer::simplifySizeof()
|
|||
}
|
||||
|
||||
// Some default value
|
||||
std::size_t size = 0;
|
||||
MathLib::biguint size = 0;
|
||||
|
||||
const unsigned int varid = nametok->varId();
|
||||
if (derefs != 0 && varid != 0 && declTokOfVar.find(varid) != declTokOfVar.end()) {
|
||||
|
|
|
@ -1499,12 +1499,14 @@ private:
|
|||
check("void f() {\n"
|
||||
" if (x & 3 == 2) {}\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (bitwise operator + comparison); Clarify expression with parentheses.\n", errout.str());
|
||||
ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (bitwise operator + comparison); Clarify expression with parentheses.\n"
|
||||
"[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout.str());
|
||||
|
||||
check("void f() {\n"
|
||||
" if (a & fred1.x == fred2.y) {}\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (bitwise operator + comparison); Clarify expression with parentheses.\n", errout.str());
|
||||
ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (bitwise operator + comparison); Clarify expression with parentheses.\n"
|
||||
"[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout.str());
|
||||
}
|
||||
|
||||
// clarify condition that uses ! operator and then bitwise operator
|
||||
|
|
Loading…
Reference in New Issue