Fix another c_strParam regression (#4394)

This commit is contained in:
chrchr-github 2022-08-23 20:26:36 +02:00 committed by GitHub
parent a2454ecbca
commit 13e8d5220c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 5 deletions

View File

@ -1937,10 +1937,10 @@ void CheckStl::string_c_str()
}
auto isString = [](const Token* str) -> bool {
while (Token::Match(str, "::|."))
str = str->astOperand2();
if (Token::Match(str, "(|[") && !(str->valueType() && str->valueType()->type == ValueType::ITERATOR))
str = str->previous();
else if (Token::simpleMatch(str, "."))
str = str->astOperand2();
return str && ((str->variable() && str->variable()->isStlStringType()) || // variable
(str->function() && isStlStringType(str->function()->retDef)) || // function returning string
(str->valueType() && str->valueType()->type == ValueType::ITERATOR && isStlStringType(str->valueType()->containerTypeToken))); // iterator pointing to string

View File

@ -3900,6 +3900,7 @@ private:
" std::string a[1];\n"
" struct U { std::string s; } u;"
"};\n"
"namespace N { namespace O { std::string s; } }\n"
"void g(const std::vector<std::string>& v, T& t) {\n"
" for (std::vector<std::string>::const_iterator it = v.begin(); it != v.end(); ++it)\n"
" f(it->c_str());\n"
@ -3907,12 +3908,14 @@ private:
" f(t.g().c_str());\n"
" f(t.a[0].c_str());\n"
" f(t.u.s.c_str());\n"
" f(N::O::s.c_str());\n"
"}\n");
ASSERT_EQUALS("[test.cpp:8]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n"
"[test.cpp:9]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n"
ASSERT_EQUALS("[test.cpp:9]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n"
"[test.cpp:10]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n"
"[test.cpp:11]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n"
"[test.cpp:12]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n",
"[test.cpp:12]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n"
"[test.cpp:13]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n"
"[test.cpp:14]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n",
errout.str());
check("void svgFile(const std::string &content, const std::string &fileName, const double end = 1000., const double start = 0.);\n"