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() != ".")
|
} else if (!tok2->isName() && !tok2->isNumber() && tok2->str() != ".")
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} 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;
|
||||||
// using boolean result in bitwise operation ! x [&|^]
|
if (vt1 && vt1->type == ValueType::BOOL)
|
||||||
for (std::size_t i = 0; i < functions; ++i) {
|
clarifyConditionError(tok, false, true);
|
||||||
const Scope * scope = symbolDatabase->functionScopes[i];
|
else if (vt2 && vt2->type == ValueType::BOOL)
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
clarifyConditionError(tok, false, true);
|
clarifyConditionError(tok, false, true);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4427,7 +4427,7 @@ std::string ValueType::str() const
|
||||||
ret += " double";
|
ret += " double";
|
||||||
else if (type == LONGDOUBLE)
|
else if (type == LONGDOUBLE)
|
||||||
ret += " long double";
|
ret += " long double";
|
||||||
for (int p = 0; p < pointer; p++) {
|
for (unsigned int p = 0; p < pointer; p++) {
|
||||||
ret += " *";
|
ret += " *";
|
||||||
if (constness & (2 << p))
|
if (constness & (2 << p))
|
||||||
ret += " const";
|
ret += " const";
|
||||||
|
|
|
@ -3278,7 +3278,7 @@ bool Tokenizer::simplifySizeof()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some default value
|
// Some default value
|
||||||
std::size_t size = 0;
|
MathLib::biguint size = 0;
|
||||||
|
|
||||||
const unsigned int varid = nametok->varId();
|
const unsigned int varid = nametok->varId();
|
||||||
if (derefs != 0 && varid != 0 && declTokOfVar.find(varid) != declTokOfVar.end()) {
|
if (derefs != 0 && varid != 0 && declTokOfVar.find(varid) != declTokOfVar.end()) {
|
||||||
|
|
|
@ -1499,12 +1499,14 @@ private:
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" if (x & 3 == 2) {}\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"
|
check("void f() {\n"
|
||||||
" if (a & fred1.x == fred2.y) {}\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
|
// clarify condition that uses ! operator and then bitwise operator
|
||||||
|
|
Loading…
Reference in New Issue