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

Method checkAlwaysTrueOrFalseStringCompare

lib/checkstring.cpp:92–134  ·  view source on GitHub ↗

--------------------------------------------------------------------------- Check for string comparison involving two static strings. if(strcmp("00FF00","00FF00")==0) // <- statement is always true ---------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

90// if(strcmp("00FF00","00FF00")==0) // <- statement is always true
91//---------------------------------------------------------------------------
92void CheckStringImpl::checkAlwaysTrueOrFalseStringCompare()
93{
94 if (!mSettings.severity.isEnabled(Severity::warning))
95 return;
96
97 logChecker("CheckString::checkAlwaysTrueOrFalseStringCompare"); // warning
98
99 for (const Token* tok = mTokenizer->tokens(); tok; tok = tok->next()) {
100 if (tok->isName() && tok->strAt(1) == "(" && Token::Match(tok, "memcmp|strncmp|strcmp|stricmp|strverscmp|bcmp|strcmpi|strcasecmp|strncasecmp|strncasecmp_l|strcasecmp_l|wcsncasecmp|wcscasecmp|wmemcmp|wcscmp|wcscasecmp_l|wcsncasecmp_l|wcsncmp|_mbscmp|_mbscmp_l|_memicmp|_memicmp_l|_stricmp|_wcsicmp|wcsicmp|_mbsicmp|_stricmp_l|_wcsicmp_l|_mbsicmp_l")) {
101 if (Token::Match(tok->tokAt(2), "%str% , %str% ,|)")) {
102 const std::string &str1 = tok->strAt(2);
103 const std::string &str2 = tok->strAt(4);
104 if (!tok->isExpandedMacro() && !tok->tokAt(2)->isExpandedMacro() && !tok->tokAt(4)->isExpandedMacro())
105 alwaysTrueFalseStringCompareError(tok, str1, str2);
106 tok = tok->tokAt(5);
107 } else if (Token::Match(tok->tokAt(2), "%name% , %name% ,|)")) {
108 const std::string &str1 = tok->strAt(2);
109 const std::string &str2 = tok->strAt(4);
110 if (str1 == str2)
111 alwaysTrueStringVariableCompareError(tok, str1, str2);
112 tok = tok->tokAt(5);
113 } else if (Token::Match(tok->tokAt(2), "%name% . c_str ( ) , %name% . c_str ( ) ,|)")) {
114 const std::string &str1 = tok->strAt(2);
115 const std::string &str2 = tok->strAt(8);
116 if (str1 == str2)
117 alwaysTrueStringVariableCompareError(tok, str1, str2);
118 tok = tok->tokAt(13);
119 }
120 } else if (tok->isName() && Token::Match(tok, "QString :: compare ( %str% , %str% )")) {
121 const std::string &str1 = tok->strAt(4);
122 const std::string &str2 = tok->strAt(6);
123 alwaysTrueFalseStringCompareError(tok, str1, str2);
124 tok = tok->tokAt(7);
125 } else if (Token::Match(tok, "!!+ %str% ==|!= %str% !!+")) {
126 const std::string &str1 = tok->strAt(1);
127 const std::string &str2 = tok->strAt(3);
128 alwaysTrueFalseStringCompareError(tok, str1, str2);
129 tok = tok->tokAt(5);
130 }
131 if (!tok)
132 break;
133 }
134}
135
136void CheckStringImpl::alwaysTrueFalseStringCompareError(const Token *tok, const std::string& str1, const std::string& str2)
137{

Callers 1

runChecksMethod · 0.80

Calls 3

nextMethod · 0.80
isEnabledMethod · 0.45
tokAtMethod · 0.45

Tested by

no test coverage detected