Refactoring. Use astIsFloat()
This commit is contained in:
parent
560cf397d3
commit
7d2357de8d
|
@ -33,15 +33,25 @@ namespace {
|
||||||
CheckOther instance;
|
CheckOther instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool astIsFloat(const Token *tok)
|
static bool astIsFloat(const Token *tok, bool unknown)
|
||||||
{
|
{
|
||||||
if (tok->astOperand1() && astIsFloat(tok->astOperand1()))
|
if (tok->astOperand1() && astIsFloat(tok->astOperand1(),unknown))
|
||||||
return true;
|
return true;
|
||||||
if (tok->astOperand2() && astIsFloat(tok->astOperand2()))
|
if (tok->astOperand2() && astIsFloat(tok->astOperand2(), unknown))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// TODO: check function calls, struct members, arrays, etc also
|
if (tok->isNumber())
|
||||||
return !tok->variable() || Token::findmatch(tok->variable()->typeStartToken(), "float|double", tok->variable()->typeEndToken()->next(), 0);
|
return MathLib::isFloat(tok->str());
|
||||||
|
|
||||||
|
if (tok->isName()) {
|
||||||
|
// TODO: check function calls, struct members, arrays, etc also
|
||||||
|
if (!tok->variable())
|
||||||
|
return unknown;
|
||||||
|
|
||||||
|
return Token::findmatch(tok->variable()->typeStartToken(), "float|double", tok->variable()->typeEndToken()->next(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isConstExpression(const Token *tok, const std::set<std::string> &constFunctions)
|
static bool isConstExpression(const Token *tok, const std::set<std::string> &constFunctions)
|
||||||
|
@ -1375,7 +1385,7 @@ void CheckOther::checkIncorrectLogicOperator()
|
||||||
if (!isSameExpression(expr1, expr2, _settings->library.functionpure))
|
if (!isSameExpression(expr1, expr2, _settings->library.functionpure))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const bool isfloat = astIsFloat(expr1) || MathLib::isFloat(value1) || astIsFloat(expr2) || MathLib::isFloat(value2);
|
const bool isfloat = astIsFloat(expr1,true) || MathLib::isFloat(value1) || astIsFloat(expr2,true) || MathLib::isFloat(value2);
|
||||||
|
|
||||||
// don't check floating point equality comparisons. that is bad
|
// don't check floating point equality comparisons. that is bad
|
||||||
// and deserves different warnings.
|
// and deserves different warnings.
|
||||||
|
@ -1767,15 +1777,18 @@ void CheckOther::checkMemsetInvalid2ndParam()
|
||||||
const Token* secondParamTok = firstParamTok->nextArgument();
|
const Token* secondParamTok = firstParamTok->nextArgument();
|
||||||
if (!secondParamTok)
|
if (!secondParamTok)
|
||||||
continue;
|
continue;
|
||||||
const Variable* secondParamVar = secondParamTok->variable();
|
|
||||||
|
// Second parameter is zero float literal, i.e. 0.0f
|
||||||
|
if (Token::Match(secondParamTok,"%num% ,") && secondParamTok->str().find_first_not_of("0.f") == std::string::npos)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const Token *top = secondParamTok;
|
||||||
|
while (top->astParent() && top->astParent()->str() != ",")
|
||||||
|
top = top->astParent();
|
||||||
|
|
||||||
// Check if second parameter is a float variable or a float literal != 0.0f
|
// Check if second parameter is a float variable or a float literal != 0.0f
|
||||||
// TODO: Use AST with astIsFloat() for catch expressions like 'a + 1.0f'
|
if (portability && astIsFloat(top,false)) {
|
||||||
if (portability &&
|
memsetFloatError(secondParamTok, top->expressionString());
|
||||||
((secondParamVar && Token::Match(secondParamVar->typeStartToken(), "float|double"))
|
|
||||||
|| (secondParamTok->isNumber() && MathLib::isFloat(secondParamTok->str()) &&
|
|
||||||
MathLib::toDoubleNumber(secondParamTok->str()) != 0.0 && secondParamTok->next()->str() == ","))) {
|
|
||||||
memsetFloatError(secondParamTok, secondParamTok->str());
|
|
||||||
} else if (warning && secondParamTok->isNumber()) { // Check if the second parameter is a literal and is out of range
|
} else if (warning && secondParamTok->isNumber()) { // Check if the second parameter is a literal and is out of range
|
||||||
const long long int value = MathLib::toLongNumber(secondParamTok->str());
|
const long long int value = MathLib::toLongNumber(secondParamTok->str());
|
||||||
if (value < -128 || value > 255)
|
if (value < -128 || value > 255)
|
||||||
|
@ -2869,11 +2882,9 @@ void CheckOther::checkDuplicateExpression()
|
||||||
if (scope->type != Scope::eFunction)
|
if (scope->type != Scope::eFunction)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Experimental implementation
|
|
||||||
// TODO: check for duplicate separated expressions: (a==1 || a==2 || a==1)
|
|
||||||
for (const Token *tok = scope->classStart; tok && tok != scope->classEnd; tok = tok->next()) {
|
for (const Token *tok = scope->classStart; tok && tok != scope->classEnd; tok = tok->next()) {
|
||||||
if (tok->isOp() && tok->astOperand1() && !Token::Match(tok, "+|*|=|<<|>>")) {
|
if (tok->isOp() && tok->astOperand1() && !Token::Match(tok, "+|*|=|<<|>>")) {
|
||||||
if (Token::Match(tok, "==|!=|-") && astIsFloat(tok->astOperand1()))
|
if (Token::Match(tok, "==|!=|-") && astIsFloat(tok->astOperand1(), true))
|
||||||
continue;
|
continue;
|
||||||
if (isSameExpression(tok->astOperand1(), tok->astOperand2(), _settings->library.functionpure))
|
if (isSameExpression(tok->astOperand1(), tok->astOperand2(), _settings->library.functionpure))
|
||||||
duplicateExpressionError(tok, tok, tok->str());
|
duplicateExpressionError(tok, tok, tok->str());
|
||||||
|
|
|
@ -4137,7 +4137,7 @@ private:
|
||||||
" const int i = g();\n"
|
" const int i = g();\n"
|
||||||
" memset(is, 1.0f + i, 40);\n"
|
" memset(is, 1.0f + i, 40);\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
TODO_ASSERT_EQUALS("[test.cpp:4]: (portability) The 2nd memset() argument '1.0f + i' is a float, its representation is implementation defined.\n", "", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (portability) The 2nd memset() argument '1.0f+i' is a float, its representation is implementation defined.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void redundantGetAndSetUserId() {
|
void redundantGetAndSetUserId() {
|
||||||
|
|
Loading…
Reference in New Issue