Skip to content

Commit ba3833c

Browse files
committed
Fixed cppcheck-opensource#3678 (stlcstrReturn for classes which don't provide a std::string)
1 parent 6b40d93 commit ba3833c

2 files changed

Lines changed: 18 additions & 3 deletions

File tree

lib/checkstl.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ void CheckStl::string_c_str()
11961196
tok2 = tok2->previous();
11971197
if (tok2 && Token::simpleMatch(tok2->tokAt(-4), ". c_str ( )")) {
11981198
const Variable* var = symbolDatabase->getVariableFromVarId(tok2->tokAt(-5)->varId());
1199-
if (var && Token::Match(var->typeStartToken(), "const| std :: string|wstring"))
1199+
if (var && Token::Match(var->typeStartToken(), "const| std ::"))
12001200
string_c_strParam(tok, i->second);
12011201
}
12021202
}
@@ -1238,8 +1238,17 @@ void CheckStl::string_c_str()
12381238
else if ((returnType == stdString || returnType == stdStringConstRef) && _settings->isEnabled("performance")) {
12391239
if (tok->str() == "return") {
12401240
const Token* tok2 = Token::findsimplematch(tok->next(), ";");
1241-
if (Token::simpleMatch(tok2->tokAt(-4), ". c_str ( )"))
1242-
string_c_strReturn(tok);
1241+
if (Token::simpleMatch(tok2->tokAt(-4), ". c_str ( )")) {
1242+
tok2 = tok2->tokAt(-5);
1243+
if (tok2->isName()) { // return var.c_str(); => check if var is a std type
1244+
const Variable* var = symbolDatabase->getVariableFromVarId(tok2->varId());
1245+
if (var && Token::Match(var->typeStartToken(), "const| std ::"))
1246+
string_c_strReturn(tok);
1247+
} else {
1248+
// TODO: determine if a error should be written or not
1249+
string_c_strReturn(tok);
1250+
}
1251+
}
12431252
}
12441253
}
12451254
}

test/teststl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,6 +1769,12 @@ class TestStl : public TestFixture {
17691769
"}");
17701770
ASSERT_EQUALS("", errout.str());
17711771

1772+
check("std::string get_msg() {\n" // #3678
1773+
" MyStringClass errmsg;\n"
1774+
" return errmsg.c_str();\n"
1775+
"}");
1776+
ASSERT_EQUALS("", errout.str());
1777+
17721778

17731779
check("void Foo1(const std::string& str) {}\n"
17741780
"void Foo2(char* c, const std::string str) {}\n"

0 commit comments

Comments
 (0)