@@ -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 }
0 commit comments