MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / checkModuloAlwaysTrueFalse

Method checkModuloAlwaysTrueFalse

lib/checkcondition.cpp:1397–1425  ·  view source on GitHub ↗

----------------------------------------------------------------------------- Detect "(var % val1) > val2" where val2 is >= val1. -----------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

1395// Detect "(var % val1) > val2" where val2 is >= val1.
1396//-----------------------------------------------------------------------------
1397void 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
1427void CheckConditionImpl::moduloAlwaysTrueFalseError(const Token* tok, const std::string& maxVal)
1428{

Callers 1

runChecksMethod · 0.80

Calls 6

nextMethod · 0.80
astOperand1Method · 0.80
astOperand2Method · 0.80
simpleMatchFunction · 0.70
isEnabledMethod · 0.45
strMethod · 0.45

Tested by

no test coverage detected