Skip to content

Commit f9b18bc

Browse files
Fix FP (regression): Resource handle 'fd' freed twice. [doubleFree] (#5424)
1 parent 4fa1c7d commit f9b18bc

2 files changed

Lines changed: 9 additions & 1 deletion

File tree

lib/checkleakautovar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ static const Token * isFunctionCall(const Token * nameToken)
281281
nameToken = nameToken->link()->next();
282282
}
283283
// check for '('
284-
if (nameToken && nameToken->link() && nameToken->str() == "(") {
284+
if (nameToken && nameToken->link() && !nameToken->isCast() && nameToken->str() == "(") {
285285
// returning opening parenthesis pointer
286286
return nameToken;
287287
}

test/testleakautovar.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ class TestLeakAutoVar : public TestFixture {
128128
TEST_CASE(doublefree12); // #10502
129129
TEST_CASE(doublefree13); // #11008
130130
TEST_CASE(doublefree14); // #9708
131+
TEST_CASE(doublefree15);
131132

132133
// exit
133134
TEST_CASE(exit1);
@@ -1528,6 +1529,13 @@ class TestLeakAutoVar : public TestFixture {
15281529
ASSERT_EQUALS("", errout.str());
15291530
}
15301531

1532+
void doublefree15() { // #11966
1533+
check("void f(FILE* fp) {\n"
1534+
" static_cast<void>(fclose(fp));\n"
1535+
"}", true);
1536+
ASSERT_EQUALS("", errout.str());
1537+
}
1538+
15311539
void exit1() {
15321540
check("void f() {\n"
15331541
" char *p = malloc(10);\n"

0 commit comments

Comments
 (0)