--------------------------------------------------------------------------- Check for string comparison involving two static strings. if(strcmp("00FF00","00FF00")==0) // <- statement is always true ---------------------------------------------------------------------------
| 90 | // if(strcmp("00FF00","00FF00")==0) // <- statement is always true |
| 91 | //--------------------------------------------------------------------------- |
| 92 | void 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 | |
| 136 | void CheckStringImpl::alwaysTrueFalseStringCompareError(const Token *tok, const std::string& str1, const std::string& str2) |
| 137 | { |