Skip to content

Commit b80cf30

Browse files
authored
Merge pull request #562 from geoffw0/cpp-308
CPP: Fix FPs for 'Resource not released in destructor' involving virtual method calls
2 parents b58c263 + d8c7537 commit b80cf30

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

cpp/ql/src/jsf/4.10 Classes/AV Rule 79.ql

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,19 @@ private predicate exprReleases(Expr e, Expr released, string kind) {
9696
) or exists(Function f, int arg |
9797
// `e` is a call to a function that releases one of it's parameters,
9898
// and `released` is the corresponding argument
99-
e.(FunctionCall).getTarget() = f and
99+
(
100+
e.(FunctionCall).getTarget() = f or
101+
e.(FunctionCall).getTarget().(MemberFunction).getAnOverridingFunction+() = f
102+
) and
100103
e.(FunctionCall).getArgument(arg) = released and
101104
exprReleases(_, exprOrDereference(f.getParameter(arg).getAnAccess()), kind)
102105
) or exists(Function f, ThisExpr innerThis |
103106
// `e` is a call to a method that releases `this`, and `released`
104107
// is the object that is called
105-
e.(FunctionCall).getTarget() = f and
108+
(
109+
e.(FunctionCall).getTarget() = f or
110+
e.(FunctionCall).getTarget().(MemberFunction).getAnOverridingFunction+() = f
111+
) and
106112
e.(FunctionCall).getQualifier() = exprOrDereference(released) and
107113
innerThis.getEnclosingFunction() = f and
108114
exprReleases(_, innerThis, kind)

cpp/ql/test/query-tests/jsf/4.10 Classes/AV Rule 79/AV Rule 79.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
| DeleteThis.cpp:56:3:56:24 | ... = ... | Resource ptr10 is acquired by class MyClass3 but not released anywhere in this class. |
99
| DeleteThis.cpp:58:3:58:24 | ... = ... | Resource ptr12 is acquired by class MyClass3 but not released anywhere in this class. |
1010
| DeleteThis.cpp:60:3:60:24 | ... = ... | Resource ptr14 is acquired by class MyClass3 but not released anywhere in this class. |
11+
| DeleteThis.cpp:127:3:127:20 | ... = ... | Resource d is acquired by class MyClass9 but not released anywhere in this class. |
1112
| ExternalOwners.cpp:49:3:49:20 | ... = ... | Resource a is acquired by class MyScreen but not released anywhere in this class. |
1213
| ListDelete.cpp:21:3:21:21 | ... = ... | Resource first is acquired by class MyThingColection but not released anywhere in this class. |
1314
| NoDestructor.cpp:23:3:23:20 | ... = ... | Resource n is acquired by class MyClass5 but not released anywhere in this class. |

cpp/ql/test/query-tests/jsf/4.10 Classes/AV Rule 79/DeleteThis.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,67 @@ class MyClass3
8282
MyClass2 *ptr10, *ptr11, *ptr12, *ptr13, *ptr14, *ptr15;
8383
MyClass2 *ptr20;
8484
};
85+
86+
class MyClass4
87+
{
88+
public:
89+
virtual void Release() = 0;
90+
};
91+
92+
class MyClass5 : public MyClass4
93+
{
94+
public:
95+
void Release()
96+
{
97+
delete this;
98+
}
99+
};
100+
101+
class MyClass6 : public MyClass5
102+
{
103+
};
104+
105+
class MyClass7 : public MyClass4
106+
{
107+
public:
108+
void Release()
109+
{
110+
// do nothing
111+
}
112+
};
113+
114+
class MyClass8 : public MyClass7
115+
{
116+
};
117+
118+
class MyClass9
119+
{
120+
public:
121+
MyClass9()
122+
{
123+
a = new MyClass5(); // GOOD
124+
b = new MyClass5(); // GOOD
125+
c = new MyClass6(); // GOOD
126+
127+
d = new MyClass7(); // BAD
128+
e = new MyClass7(); // BAD [NOT DETECTED]
129+
f = new MyClass8(); // BAD [NOT DETECTED]
130+
}
131+
~MyClass9()
132+
{
133+
a->Release(); // MyClass5::Release()
134+
b->Release(); // MyClass5::Release()
135+
c->Release(); // MyClass5::Release()
136+
137+
d->Release(); // MyClass7::Release()
138+
e->Release(); // MyClass7::Release()
139+
f->Release(); // MyClass7::Release()
140+
}
141+
MyClass5 *a;
142+
MyClass4 *b;
143+
MyClass4 *c;
144+
145+
MyClass7 *d;
146+
MyClass4 *e;
147+
MyClass4 *f;
148+
};

0 commit comments

Comments
 (0)