| 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 | |
| 5166 | static bool valueFlowForLoop2(const Token *tok, |
nothing calls this directly
no test coverage detected