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

Method parse

lib/valueflow.cpp:5117–5163  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5115 }
5116
5117 std::vector<Condition> parse(const Token* tok, const Settings& settings) const override
5118 {
5119 if (!Token::Match(tok, "%comp%"))
5120 return {};
5121 if (tok->hasKnownIntValue())
5122 return {};
5123 if (!tok->astOperand1() || tok->astOperand1()->hasKnownIntValue() || tok->astOperand1()->isLiteral())
5124 return {};
5125 if (!tok->astOperand2() || tok->astOperand2()->hasKnownIntValue() || tok->astOperand2()->isLiteral())
5126 return {};
5127 if (!isConstExpression(tok, settings.library))
5128 return {};
5129
5130 std::vector<Condition> result;
5131 auto addCond = [&](const Token* lhsTok, const Token* rhsTok, bool inverted) {
5132 for (int i = 0; i < 2; i++) {
5133 const bool lhs = i == 0;
5134 const Token* vartok = lhs ? lhsTok : rhsTok;
5135 const Token* valuetok = lhs ? rhsTok : lhsTok;
5136 if (valuetok->exprId() == 0)
5137 continue;
5138 if (valuetok->hasKnownSymbolicValue(vartok))
5139 continue;
5140 if (vartok->hasKnownSymbolicValue(valuetok))
5141 continue;
5142 ValueFlow::Value true_value;
5143 ValueFlow::Value false_value;
5144 setConditionalValues(tok, !lhs, 0, true_value, false_value);
5145 setSymbolic(true_value, valuetok);
5146 setSymbolic(false_value, valuetok);
5147
5148 Condition cond;
5149 cond.true_values = {std::move(true_value)};
5150 cond.false_values = {std::move(false_value)};
5151 cond.vartok = vartok;
5152 cond.inverted = inverted;
5153 result.push_back(std::move(cond));
5154 }
5155 };
5156 addCond(tok->astOperand1(), tok->astOperand2(), false);
5157 if (Token::Match(tok, "==|!=") && (isNegatedBool(tok->astOperand1()) || isNegatedBool(tok->astOperand2()))) {
5158 const Token* lhsTok = skipNot(tok->astOperand1());
5159 const Token* rhsTok = skipNot(tok->astOperand2());
5160 addCond(lhsTok, rhsTok, !(isNegatedBool(tok->astOperand1()) && isNegatedBool(tok->astOperand2())));
5161 }
5162 return result;
5163 }
5164};
5165
5166static bool valueFlowForLoop2(const Token *tok,

Callers

nothing calls this directly

Calls 8

isConstExpressionFunction · 0.85
setConditionalValuesFunction · 0.85
setSymbolicFunction · 0.85
astOperand1Method · 0.80
astOperand2Method · 0.80
hasKnownSymbolicValueMethod · 0.80
hasKnownIntValueMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected