Skip to content

Commit 6ae7be0

Browse files
pfultz2danmar
authored andcommitted
Fix FP with lifetime containers (cppcheck-opensource#1865)
1 parent 9e457b6 commit 6ae7be0

3 files changed

Lines changed: 17 additions & 1 deletion

File tree

lib/token.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,6 +1827,12 @@ std::pair<const Token*, const Token*> Token::typeDecl(const Token * tok)
18271827
}
18281828
std::string Token::typeStr(const Token* tok)
18291829
{
1830+
if (tok->valueType()) {
1831+
const ValueType * vt = tok->valueType();
1832+
std::string ret = vt->str();
1833+
if (!ret.empty())
1834+
return ret;
1835+
}
18301836
std::pair<const Token*, const Token*> r = Token::typeDecl(tok);
18311837
if (!r.first || !r.second)
18321838
return "";

lib/valueflow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3161,7 +3161,7 @@ static void valueFlowLifetimeFunction(Token *tok, TokenList *tokenlist, ErrorLog
31613161
Token *vartok = tok->tokAt(-2);
31623162
std::vector<const Token *> args = getArguments(tok);
31633163
std::size_t n = args.size();
3164-
if (n > 1 && astCanonicalType(args[n - 2]) == astCanonicalType(args[n - 1]) &&
3164+
if (n > 1 && Token::typeStr(args[n - 2]) == Token::typeStr(args[n - 1]) &&
31653165
(((astIsIterator(args[n - 2]) && astIsIterator(args[n - 1])) ||
31663166
(astIsPointer(args[n - 2]) && astIsPointer(args[n - 1]))))) {
31673167
LifetimeStore{args.back(), "Added to container '" + vartok->str() + "'.", ValueFlow::Value::Object} .byDerefCopy(

test/testautovariables.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,6 +1701,16 @@ class TestAutoVariables : public TestFixture {
17011701
"};\n");
17021702
ASSERT_EQUALS("", errout.str());
17031703

1704+
check("void f(bool b) {\n"
1705+
" std::vector<int> v = {1};\n"
1706+
" if (b) {\n"
1707+
" int a[] = {0};\n"
1708+
" v.insert(a, a+1);\n"
1709+
" }\n"
1710+
" return v.back() == 0;\n"
1711+
"}\n");
1712+
ASSERT_EQUALS("", errout.str());
1713+
17041714
check("class A {\n"
17051715
" int f( P p ) {\n"
17061716
" std::vector< S > maps;\n"

0 commit comments

Comments
 (0)