diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 17bd116ed98..0814aaeee3c 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -825,7 +825,8 @@ const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const t const std::map::const_iterator var = varInfo.alloctype.find(tok->varId()); if (var != varInfo.alloctype.end()) { bool unknown = false; - if (var->second.status == VarInfo::DEALLOC && CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings, /*checkNullArg*/ false) && !unknown) { + if (var->second.status == VarInfo::DEALLOC && !Library::isresource(var->second.type) && + CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings, /*checkNullArg*/ false) && !unknown) { deallocUseError(tok, tok->str()); } else if (Token::simpleMatch(tok->tokAt(-2), "= &")) { varInfo.erase(tok->varId()); @@ -930,8 +931,10 @@ void CheckLeakAutoVar::changeAllocStatus(VarInfo &varInfo, const VarInfo::AllocI var->second.allocTok = allocation.allocTok; } } else if (allocation.status != VarInfo::NOALLOC && allocation.status != VarInfo::OWNED && !Token::simpleMatch(tok->astTop(), "return")) { - alloctype[arg->varId()].status = VarInfo::DEALLOC; - alloctype[arg->varId()].allocTok = tok; + auto& allocInfo = alloctype[arg->varId()]; + allocInfo.status = VarInfo::DEALLOC; + allocInfo.allocTok = tok; + allocInfo.type = allocation.type; } } diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 41fd7af24ea..39891e8eb71 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -3334,6 +3334,7 @@ class TestLeakAutoVarPosix : public TestFixture { void run() override { TEST_CASE(memleak_getline); + TEST_CASE(deallocuse_fdopen); } void memleak_getline() { @@ -3344,6 +3345,21 @@ class TestLeakAutoVarPosix : public TestFixture { "}\n"); ASSERT_EQUALS("", errout_str()); } + + void deallocuse_fdopen() { + check("struct FileCloser {\n" // #13126 + " void operator()(std::FILE * ptr) const {\n" + " std::fclose(ptr);\n" + " }\n" + "};\n" + "void f(char* fileName) {\n" + " std::unique_ptr out;\n" + " int fd = mkstemps(fileName, 4);\n" + " if (fd != -1)\n" + " out.reset(fdopen(fd, \"w\"));\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); + } }; REGISTER_TEST(TestLeakAutoVarPosix)