Temporarily revert "Fixed (condition is always true (variable is assigned constant value and then used in condition))"

This reverts commit a3fbad50cb2d21d88f51b105a73ef89773dfda6b.

The ValueFlow must be updated before this can be re-added.
This commit is contained in:
Daniel Marjamäki 2015-07-16 21:10:46 +02:00
parent 09efe140fe
commit 15a8e4d2df
5 changed files with 1 additions and 78 deletions

@ -930,40 +930,3 @@ void CheckCondition::clarifyConditionError(const Token *tok, bool assign, bool b
"clarifyCondition", "clarifyCondition",
errmsg); errmsg);
} }
void CheckCondition::alwaysTrueFalse()
{
if (!_settings->isEnabled("style"))
return;
const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase();
const std::size_t functions = symbolDatabase->functionScopes.size();
for (std::size_t i = 0; i < functions; ++i) {
const Scope * scope = symbolDatabase->functionScopes[i];
for (const Token* tok = scope->classStart->next(); tok != scope->classEnd; tok = tok->next()) {
if (!Token::Match(tok, "%comp%|!"))
continue;
if (tok->link()) // don't write false positives when templates are used
continue;
if (tok->values.size() != 1U)
continue;
if (tok->values.front().valueKind != ValueFlow::Value::Known)
continue;
if (tok->astParent() && Token::Match(tok->astParent()->previous(), "%name% ("))
alwaysTrueFalseError(tok, tok->values.front().intvalue != 0);
}
}
}
void CheckCondition::alwaysTrueFalseError(const Token *tok, bool knownResult)
{
const std::string expr = tok ? tok->expressionString() : std::string("x");
reportError(tok,
Severity::style,
"knownConditionTrueFalse",
"Condition " + expr + " is always " + (knownResult ? "true" : "false"));
}

@ -59,7 +59,6 @@ public:
checkCondition.oppositeInnerCondition(); checkCondition.oppositeInnerCondition();
checkCondition.checkIncorrectLogicOperator(); checkCondition.checkIncorrectLogicOperator();
checkCondition.checkModuloAlwaysTrueFalse(); checkCondition.checkModuloAlwaysTrueFalse();
checkCondition.alwaysTrueFalse();
} }
/** mismatching assignment / comparison */ /** mismatching assignment / comparison */
@ -94,9 +93,6 @@ public:
/** @brief Suspicious condition (assignment+comparison) */ /** @brief Suspicious condition (assignment+comparison) */
void clarifyCondition(); void clarifyCondition();
/** @brief Condition is always true/false */
void alwaysTrueFalse();
private: private:
bool isOverlappingCond(const Token * const cond1, const Token * const cond2, const std::set<std::string> &constFunctions) const; bool isOverlappingCond(const Token * const cond1, const Token * const cond2, const std::set<std::string> &constFunctions) const;
@ -127,8 +123,6 @@ private:
void clarifyConditionError(const Token *tok, bool assign, bool boolop); void clarifyConditionError(const Token *tok, bool assign, bool boolop);
void alwaysTrueFalseError(const Token *tok, bool knownResult);
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const {
CheckCondition c(0, settings, errorLogger); CheckCondition c(0, settings, errorLogger);
@ -142,7 +136,6 @@ private:
c.redundantConditionError(0, "If x > 11 the condition x > 10 is always true."); c.redundantConditionError(0, "If x > 11 the condition x > 10 is always true.");
c.moduloAlwaysTrueFalseError(0, "1"); c.moduloAlwaysTrueFalseError(0, "1");
c.clarifyConditionError(0, true, false); c.clarifyConditionError(0, true, false);
c.alwaysTrueFalseError(0, true);
} }
static std::string myName() { static std::string myName() {
@ -159,8 +152,7 @@ private:
"- Find dead code which is inaccessible due to the counter-conditions check in nested if statements\n" "- Find dead code which is inaccessible due to the counter-conditions check in nested if statements\n"
"- condition that is always true/false\n" "- condition that is always true/false\n"
"- mutual exclusion over || always evaluating to true\n" "- mutual exclusion over || always evaluating to true\n"
"- Comparisons of modulo results that are always true/false.\n" "- Comparisons of modulo results that are always true/false.\n";
"- Known variable values => condition is always true/false\n";
} }
}; };
/// @} /// @}

@ -407,18 +407,6 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value)
} }
} }
// !
else if (parent->str() == "!") {
std::list<ValueFlow::Value>::const_iterator it;
for (it = tok->values.begin(); it != tok->values.end(); ++it) {
if (it->tokvalue)
continue;
ValueFlow::Value v(*it);
v.intvalue = !v.intvalue;
setTokenValue(parent, v);
}
}
// Array element // Array element
else if (parent->str() == "[" && parent->astOperand1() && parent->astOperand2()) { else if (parent->str() == "[" && parent->astOperand1() && parent->astOperand2()) {
std::list<ValueFlow::Value>::const_iterator value1, value2; std::list<ValueFlow::Value>::const_iterator value1, value2;

@ -62,8 +62,6 @@ private:
TEST_CASE(clarifyCondition4); // ticket #3110 TEST_CASE(clarifyCondition4); // ticket #3110
TEST_CASE(clarifyCondition5); // #3609 CWinTraits<WS_CHILD|WS_VISIBLE>.. TEST_CASE(clarifyCondition5); // #3609 CWinTraits<WS_CHILD|WS_VISIBLE>..
TEST_CASE(clarifyCondition6); // #3818 TEST_CASE(clarifyCondition6); // #3818
TEST_CASE(alwaysTrue);
} }
void check(const char code[], bool validate=true, const char* filename = "test.cpp") { void check(const char code[], bool validate=true, const char* filename = "test.cpp") {
@ -1489,15 +1487,6 @@ private:
"}"); "}");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void alwaysTrue() {
check("void f() {\n" // #4842
" int x = 0;\n"
" if (a) { return; }\n" // <- this is just here to fool simplifyKnownVariabels
" if (!x) {}\n"
"}");
ASSERT_EQUALS("[test.cpp:4]: (style) Condition !x is always true\n", errout.str());
}
}; };
REGISTER_TEST(TestCondition) REGISTER_TEST(TestCondition)

@ -265,15 +265,6 @@ private:
ASSERT_EQUALS(2, values.front().intvalue); ASSERT_EQUALS(2, values.front().intvalue);
ASSERT_EQUALS(3, values.back().intvalue); ASSERT_EQUALS(3, values.back().intvalue);
// !
code = "void f(int x) {\n"
" a = !x;\n"
" if (x==0) {}\n"
"}";
values = tokenValues(code,"!");
ASSERT_EQUALS(1U, values.size());
ASSERT_EQUALS(1, values.back().intvalue);
// function call => calculation // function call => calculation
code = "void f(int x) {\n" code = "void f(int x) {\n"
" a = x + 8;\n" " a = x + 8;\n"