diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index e5220e701a3..6dc760618c8 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -138,7 +138,8 @@ void CheckLeakAutoVarImpl::deallocReturnError(const Token *tok, const Token *dea void CheckLeakAutoVarImpl::configurationInfo(const Token* tok, const std::pair& functionUsage) { if (mSettings.checkLibrary && functionUsage.second == VarInfo::USED && - (!functionUsage.first || !functionUsage.first->function() || !functionUsage.first->function()->hasBody())) { + (!functionUsage.first || !functionUsage.first->function() || !functionUsage.first->function()->hasBody()) && + !(functionUsage.first && mSettings.library.isUse(mSettings.library.getFunctionName(functionUsage.first)))) { std::string funcStr = functionUsage.first ? mSettings.library.getFunctionName(functionUsage.first) : "f"; if (funcStr.empty()) funcStr = "unknown::" + functionUsage.first->str(); diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index cb5f9d53c8a..f644958c13c 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -202,6 +202,7 @@ class TestLeakAutoVar : public TestFixture { TEST_CASE(configuration4); TEST_CASE(configuration5); TEST_CASE(configuration6); + TEST_CASE(configurationUse); TEST_CASE(ptrptr); @@ -3102,6 +3103,29 @@ class TestLeakAutoVar : public TestFixture { ASSERT_EQUALS("[test.cpp:5:5]: (error) Resource leak: file [resourceLeak]\n", errout_str()); } + void configurationUse() { + // A function configured with takes care of the memory, so it needs + // no further configuration. + constexpr char xmldata[] = "\n" + "\n" + " \n" + " myalloc\n" + " set_data\n" + " myfree\n" + " \n" + " \n" + " false\n" + " \n" + " \n" + "\n"; + const Settings settingsUse = settingsBuilder().libraryxml(xmldata).checkLibrary().build(); + check("void f() {\n" + " char *p = myalloc(10);\n" + " set_data(p);\n" + "}\n", settingsUse); + ASSERT_EQUALS("", errout_str()); + } + void configuration6() { check("void f() {}\n" // #11198 "void g() {\n"