Partial fix for #11543 checkLibraryFunction warning for smartpointer in container (#4781)

This commit is contained in:
chrchr-github 2023-02-25 15:47:02 +01:00 committed by GitHub
parent 36192c50f6
commit 29b651f264
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 8 deletions

View File

@ -1323,7 +1323,7 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
Token* memberTok = tok->next()->link()->tokAt(2);
const Scope* scope = vt->containerTypeToken->scope();
const Type* contType{};
const std::string typeStr = vt->containerTypeToken->expressionString();
const std::string& typeStr = vt->containerTypeToken->str(); // TODO: handle complex type expressions
while (scope && !contType) {
contType = scope->findType(typeStr); // find the type stored in the container
scope = scope->nestedIn;
@ -2276,7 +2276,7 @@ void Variable::setValueType(const ValueType &valueType)
setFlag(fIsSmartPointer, true);
}
const Type *Variable::smartPointerType() const
const Type* Variable::smartPointerType() const
{
if (!isSmartPointer())
return nullptr;
@ -2284,12 +2284,19 @@ const Type *Variable::smartPointerType() const
if (mValueType->smartPointerType)
return mValueType->smartPointerType;
// TODO: Cache result
const Token *ptrType = typeStartToken();
while (Token::Match(ptrType, "%name%|::"))
ptrType = ptrType->next();
if (Token::Match(ptrType, "< %name% >"))
return ptrType->scope()->findType(ptrType->next()->str());
// TODO: Cache result, handle more complex type expression
const Token* typeTok = typeStartToken();
while (Token::Match(typeTok, "%name%|::"))
typeTok = typeTok->next();
if (Token::Match(typeTok, "< %name% >")) {
const Scope* scope = typeTok->scope();
const Type* ptrType{};
while (scope && !ptrType) {
ptrType = scope->findType(typeTok->next()->str());
scope = scope->nestedIn;
}
return ptrType;
}
return nullptr;
}

View File

@ -1966,6 +1966,17 @@ private:
"}\n");
ASSERT_EQUALS("", errout.str());
check("struct S {\n" // #11543
" S() {}\n"
" std::vector<std::shared_ptr<S>> v;\n"
" void f(int i) const;\n"
"};\n"
"void S::f(int i) const {\n"
" for (const std::shared_ptr<S>& c : v)\n"
" c->f(i);\n"
"}\n");
ASSERT_EQUALS("", errout.str());
check("namespace N {\n"
" struct S { static const std::set<std::string> s; };\n"
"}\n"