Fix false positive for opposite conditions when using different containers (#1143)
* Fix false positive for opposite conditions when using different containers * Add additional test
This commit is contained in:
parent
b6504c70ca
commit
0c6f184423
|
@ -273,11 +273,15 @@ bool isOppositeCond(bool isNot, bool cpp, const Token * const cond1, const Token
|
||||||
if (isSameExpression(cpp, true, cond1->astOperand2(), cond2->astOperand2(), library, pure))
|
if (isSameExpression(cpp, true, cond1->astOperand2(), cond2->astOperand2(), library, pure))
|
||||||
return isDifferentKnownValues(cond1->astOperand1(), cond2->astOperand1());
|
return isDifferentKnownValues(cond1->astOperand1(), cond2->astOperand1());
|
||||||
}
|
}
|
||||||
if (Library::isContainerYield(cond1, Library::Container::EMPTY, "empty") && Library::isContainerYield(cond2->astOperand1(), Library::Container::SIZE, "size")) {
|
if (Library::isContainerYield(cond1, Library::Container::EMPTY, "empty") &&
|
||||||
|
Library::isContainerYield(cond2->astOperand1(), Library::Container::SIZE, "size") &&
|
||||||
|
cond1->astOperand1()->astOperand1()->varId() == cond2->astOperand1()->astOperand1()->astOperand1()->varId()) {
|
||||||
return !(cond2->str() == "==" && cond2->astOperand2()->getValue(0));
|
return !(cond2->str() == "==" && cond2->astOperand2()->getValue(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Library::isContainerYield(cond2, Library::Container::EMPTY, "empty") && Library::isContainerYield(cond1->astOperand1(), Library::Container::SIZE, "size")) {
|
if (Library::isContainerYield(cond2, Library::Container::EMPTY, "empty") &&
|
||||||
|
Library::isContainerYield(cond1->astOperand1(), Library::Container::SIZE, "size") &&
|
||||||
|
cond2->astOperand1()->astOperand1()->varId() == cond1->astOperand1()->astOperand1()->astOperand1()->varId()) {
|
||||||
return !(cond1->str() == "==" && cond1->astOperand2()->getValue(0));
|
return !(cond1->str() == "==" && cond1->astOperand2()->getValue(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1866,6 +1866,15 @@ private:
|
||||||
|
|
||||||
check("void f1(const std::string &s, bool b) { if(s.empty() || ((s.size() == 1) && b)) {}} ");
|
check("void f1(const std::string &s, bool b) { if(s.empty() || ((s.size() == 1) && b)) {}} ");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f1(const std::string &x, const std::string &y) { if(x.size() > 42) if(y.empty()) {}} ");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f1(const std::string &x, const std::string &y) { if(y.empty()) if(x.size() > 42) {}} ");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f1(const std::string v[10]) { if(v[0].size() > 42) if(v[1].empty()) {}} ");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void identicalConditionAfterEarlyExit() {
|
void identicalConditionAfterEarlyExit() {
|
||||||
|
|
Loading…
Reference in New Issue