----------------------------------------------------------------------------- Detect "(var % val1) > val2" where val2 is >= val1. -----------------------------------------------------------------------------
| 1395 | // Detect "(var % val1) > val2" where val2 is >= val1. |
| 1396 | //----------------------------------------------------------------------------- |
| 1397 | void CheckConditionImpl::checkModuloAlwaysTrueFalse() |
| 1398 | { |
| 1399 | if (!mSettings.severity.isEnabled(Severity::warning)) |
| 1400 | return; |
| 1401 | |
| 1402 | logChecker("CheckCondition::checkModuloAlwaysTrueFalse"); // warning |
| 1403 | |
| 1404 | const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase(); |
| 1405 | for (const Scope * scope : symbolDatabase->functionScopes) { |
| 1406 | for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { |
| 1407 | if (!tok->isComparisonOp()) |
| 1408 | continue; |
| 1409 | const Token *num, *modulo; |
| 1410 | if (Token::simpleMatch(tok->astOperand1(), "%") && Token::Match(tok->astOperand2(), "%num%")) { |
| 1411 | modulo = tok->astOperand1(); |
| 1412 | num = tok->astOperand2(); |
| 1413 | } else if (Token::Match(tok->astOperand1(), "%num%") && Token::simpleMatch(tok->astOperand2(), "%")) { |
| 1414 | num = tok->astOperand1(); |
| 1415 | modulo = tok->astOperand2(); |
| 1416 | } else { |
| 1417 | continue; |
| 1418 | } |
| 1419 | |
| 1420 | if (Token::Match(modulo->astOperand2(), "%num%") && |
| 1421 | MathLib::isLessEqual(modulo->astOperand2()->str(), num->str())) |
| 1422 | moduloAlwaysTrueFalseError(tok, modulo->astOperand2()->str()); |
| 1423 | } |
| 1424 | } |
| 1425 | } |
| 1426 | |
| 1427 | void CheckConditionImpl::moduloAlwaysTrueFalseError(const Token* tok, const std::string& maxVal) |
| 1428 | { |
no test coverage detected