From 1a9e8c158d754c7eed30937cfe23e4cbdbddef7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 27 Apr 2018 23:20:04 +0200 Subject: [PATCH] CheckClass::copyconstructors: Use library to determine if function is a allocation function --- lib/checkclass.cpp | 6 ++++-- test/testclass.cpp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 295d9ea06..8a1e2a25a 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -288,14 +288,16 @@ void CheckClass::copyconstructors() continue; const Token* tok = func.token->linkAt(1); for (const Token* const end = func.functionScope->bodyStart; tok != end; tok = tok->next()) { - if (Token::Match(tok, "%var% ( new|malloc|g_malloc|g_try_malloc|realloc|g_realloc|g_try_realloc")) { + if (Token::Match(tok, "%var% ( new") || + (Token::Match(tok, "%var% ( %name% (") && _settings->library.alloc(tok->tokAt(2)))) { const Variable* var = tok->variable(); if (var && var->isPointer() && var->scope() == scope) allocatedVars[tok->varId()] = tok; } } for (const Token* const end = func.functionScope->bodyEnd; tok != end; tok = tok->next()) { - if (Token::Match(tok, "%var% = new|malloc|g_malloc|g_try_malloc|realloc|g_realloc|g_try_realloc")) { + if (Token::Match(tok, "%var% = new") || + (Token::Match(tok, "%var% = %name% (") && _settings->library.alloc(tok->tokAt(2)))) { const Variable* var = tok->variable(); if (var && var->isPointer() && var->scope() == scope && !var->isStatic()) allocatedVars[tok->varId()] = tok; diff --git a/test/testclass.cpp b/test/testclass.cpp index 518ae014c..4dee5a10c 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -38,6 +38,22 @@ private: settings0.addEnabled("style"); settings1.addEnabled("warning"); + // Load std.cfg configuration + { + const char xmldata[] = "\n" + "\n" + " \n" + " malloc\n" + " free\n" + " \n" + ""; + tinyxml2::XMLDocument doc; + doc.Parse(xmldata, sizeof(xmldata)); + settings0.library.load(doc); + settings1.library.load(doc); + } + + TEST_CASE(virtualDestructor1); // Base class not found => no error TEST_CASE(virtualDestructor2); // Base class doesn't have a destructor TEST_CASE(virtualDestructor3); // Base class has a destructor, but it's not virtual