Fixed false positive on C code introduced by last commit
This commit is contained in:
parent
d19eabde42
commit
4cad064c3c
|
@ -2894,7 +2894,7 @@ void CheckOther::checkSuspiciousStringCompare()
|
||||||
const Token* varTok = tok;
|
const Token* varTok = tok;
|
||||||
const Token* litTok = tok->tokAt(2);
|
const Token* litTok = tok->tokAt(2);
|
||||||
|
|
||||||
if (varTok->strAt(-1) == "+" || litTok->strAt(1) == "+")
|
if (!_tokenizer->isC() && (varTok->strAt(-1) == "+" || litTok->strAt(1) == "+"))
|
||||||
continue;
|
continue;
|
||||||
// rough filter for index access (#5734). Might cause false negatives in multidimensional structures
|
// rough filter for index access (#5734). Might cause false negatives in multidimensional structures
|
||||||
if (Token::simpleMatch(varTok->tokAt(1), "[") || Token::simpleMatch(litTok->tokAt(1), "["))
|
if (Token::simpleMatch(varTok->tokAt(1), "[") || Token::simpleMatch(litTok->tokAt(1), "["))
|
||||||
|
@ -2906,11 +2906,13 @@ void CheckOther::checkSuspiciousStringCompare()
|
||||||
if (!var)
|
if (!var)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (_tokenizer->isC() ||
|
|
||||||
(var->isPointer() && varTok->strAt(-1) != "*" && !Token::Match(varTok->next(), "[.([]"))) {
|
if (litTok->type() == Token::eString) {
|
||||||
if (litTok->type() == Token::eString)
|
if (_tokenizer->isC() ||
|
||||||
|
(var->isPointer() && varTok->strAt(-1) != "*" && !Token::Match(varTok->next(), "[.([]")))
|
||||||
suspiciousStringCompareError(tok, var->name());
|
suspiciousStringCompareError(tok, var->name());
|
||||||
else if (litTok->type() == Token::eNumber && litTok->originalName() == "'\\0'")
|
} else if (litTok->type() == Token::eNumber && litTok->originalName() == "'\\0'") {
|
||||||
|
if (var->isPointer() && varTok->strAt(-1) != "*" && !Token::Match(varTok->next(), "[.([]"))
|
||||||
suspiciousStringCompareError_char(tok, var->name());
|
suspiciousStringCompareError_char(tok, var->name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5176,9 +5176,24 @@ private:
|
||||||
|
|
||||||
check("bool foo(char* c) {\n"
|
check("bool foo(char* c) {\n"
|
||||||
" return \"x\" == c+foo;\n"
|
" return \"x\" == c+foo;\n"
|
||||||
"}");
|
"}", "test.cpp");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("bool foo(char* c) {\n"
|
||||||
|
" return \"x\" == c+foo;\n"
|
||||||
|
"}", "test.c");
|
||||||
|
ASSERT_EQUALS("[test.c:2]: (warning) String literal compared with variable 'c'. Did you intend to use strcmp() instead?\n", errout.str());
|
||||||
|
|
||||||
|
check("bool foo(Foo c) {\n"
|
||||||
|
" return \"x\" == c.foo;\n"
|
||||||
|
"}", "test.cpp");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("bool foo(Foo c) {\n"
|
||||||
|
" return \"x\" == c.foo;\n"
|
||||||
|
"}", "test.c");
|
||||||
|
ASSERT_EQUALS("[test.c:2]: (warning) String literal compared with variable 'c'. Did you intend to use strcmp() instead?\n", errout.str());
|
||||||
|
|
||||||
check("bool foo(const std::string& c) {\n"
|
check("bool foo(const std::string& c) {\n"
|
||||||
" return \"x\" == c;\n"
|
" return \"x\" == c;\n"
|
||||||
"}");
|
"}");
|
||||||
|
@ -5253,6 +5268,21 @@ private:
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("bool foo(char* c) {\n"
|
||||||
|
" return *c == 0;\n"
|
||||||
|
"}", "test.c");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("bool foo(char* c) {\n"
|
||||||
|
" return *c == 0;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("bool foo(Foo* c) {\n"
|
||||||
|
" return 0 == c->x;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
check("void foo(char* c) {\n"
|
check("void foo(char* c) {\n"
|
||||||
" if(c == '\\0') bar();\n"
|
" if(c == '\\0') bar();\n"
|
||||||
"}");
|
"}");
|
||||||
|
|
Loading…
Reference in New Issue