void CheckCondition::multiCondition() { if (!_settings->isEnabled("style")) return; const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase(); for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) { if (i->type != Scope::eIf) continue; const Token * const cond1 = i->classDef->next()->astOperand2(); const Token * tok2 = i->classDef->next(); for (;;) { tok2 = tok2->link(); if (!Token::simpleMatch(tok2, ") {")) break; tok2 = tok2->linkAt(1); if (!Token::simpleMatch(tok2, "} else { if (")) break; tok2 = tok2->tokAt(4); if (isOverlappingCond(cond1, tok2->astOperand2(), _settings->library.functionpure)) multiConditionError(tok2, cond1->linenr()); } } }
void CheckAssignIf::multiCondition() { if (!_settings->isEnabled("style")) return; const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase(); for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) { if (i->type == Scope::eIf && Token::Match(i->classDef, "if ( %var% & %num% ) {")) { const Token* const tok = i->classDef; const unsigned int varid(tok->tokAt(2)->varId()); if (varid == 0) continue; const MathLib::bigint num1 = MathLib::toLongNumber(tok->strAt(4)); if (num1 < 0) continue; const Token *tok2 = tok->linkAt(6); while (Token::simpleMatch(tok2, "} else { if (")) { // Goto '(' const Token * const opar = tok2->tokAt(4); // tok2: skip if-block tok2 = opar->link(); if (Token::simpleMatch(tok2, ") {")) tok2 = tok2->next()->link(); // check condition.. if (Token::Match(opar, "( %varid% ==|& %num% &&|%oror%|)", varid)) { const MathLib::bigint num2 = MathLib::toLongNumber(opar->strAt(3)); if (num2 < 0) continue; if ((num1 & num2) == num2) { multiConditionError(opar, tok->linenr()); } } } } } }