Skip to content

Commit 995627c

Browse files
Update checkstl.cpp
1 parent a271422 commit 995627c

1 file changed

Lines changed: 17 additions & 23 deletions

File tree

lib/checkstl.cpp

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,57 +1959,51 @@ static bool isLocal(const Token *tok)
19591959
return var && !var->isStatic() && var->isLocal();
19601960
}
19611961

1962-
static bool isc_strCall(const Token* tok)
1962+
static bool isc_strCall(const Token* tok, const Library::Container* container)
19631963
{
19641964
if (!Token::simpleMatch(tok, "("))
19651965
return false;
19661966
const Token* dot = tok->astOperand1();
19671967
if (!Token::simpleMatch(dot, "."))
19681968
return false;
19691969
const Token* obj = dot->astOperand1();
1970-
if (!obj || !obj->valueType() || !obj->valueType()->container ||
1971-
!obj->valueType()->container->stdStringLike || !obj->valueType()->container->startPatternHasStd)
1970+
if (!obj || !obj->valueType())
1971+
return false;
1972+
const Library::Container* objContainer = obj->valueType()->container;
1973+
if (!objContainer || !container || !objContainer->stdStringLike || (objContainer != container && !container->view))
19721974
return false;
19731975
return Token::Match(dot->astOperand2(), "c_str|data ( )");
19741976
}
19751977

19761978
static bool isc_strConcat(const Token* tok)
19771979
{
1978-
if (!Token::simpleMatch(tok, "+") || !tok->isBinaryOp())
1980+
if (!tok->isBinaryOp() || !Token::simpleMatch(tok, "+"))
19791981
return false;
1980-
const Token* cstr = nullptr;
19811982
for (const Token* op : { tok->astOperand1(), tok->astOperand2() }) {
1982-
if (isc_strCall(op)) {
1983-
cstr = op;
1984-
break;
1985-
}
1983+
const Token* sibling = op->astSibling();
1984+
if (!sibling->valueType())
1985+
continue;
1986+
if (isc_strCall(op, sibling->valueType()->container))
1987+
return true;
19861988
}
1987-
if (!cstr)
1988-
return false;
1989-
const Token* strTok = (cstr == tok->astOperand1()) ? tok->astOperand2() : tok->astOperand1();
1990-
return strTok->valueType() && strTok->valueType()->container &&
1991-
strTok->valueType()->container->stdStringLike && strTok->valueType()->container->startPatternHasStd;
1989+
return false;
19921990
}
19931991

19941992
static bool isc_strAssignment(const Token* tok)
19951993
{
19961994
if (!Token::simpleMatch(tok, "="))
19971995
return false;
1998-
if (!isc_strCall(tok->astOperand2()))
1999-
return false;
20001996
const Token* strTok = tok->astOperand1();
2001-
return strTok && strTok->valueType() && strTok->valueType()->container &&
2002-
strTok->valueType()->container->stdStringLike && strTok->valueType()->container->startPatternHasStd;
1997+
if (!strTok || !strTok->valueType())
1998+
return false;
1999+
return isc_strCall(tok->astOperand2(), strTok->valueType()->container);
20032000
}
20042001

20052002
static bool isc_strConstructor(const Token* tok)
20062003
{
2007-
if (!Token::Match(tok, "%var% (|{"))
2008-
return false;
2009-
if (!isc_strCall(tok->tokAt(1)->astOperand2()))
2004+
if (!tok->valueType() || !Token::Match(tok, "%var% (|{"))
20102005
return false;
2011-
return tok->valueType() && tok->valueType()->container &&
2012-
tok->valueType()->container->stdStringLike && tok->valueType()->container->startPatternHasStd;
2006+
return isc_strCall(tok->tokAt(1)->astOperand2(), tok->valueType()->container);
20132007
}
20142008

20152009
namespace {

0 commit comments

Comments
 (0)