-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathNonVirtualDestructorInBaseClass.ql
More file actions
33 lines (30 loc) · 1.29 KB
/
NonVirtualDestructorInBaseClass.ql
File metadata and controls
33 lines (30 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @name Non-virtual destructor in base class
* @description All base classes with a virtual function should define a virtual destructor. If an application attempts to delete a derived class object through a base class pointer, the result is undefined if the base class destructor is non-virtual.
* @kind problem
* @problem.severity warning
* @precision high
* @id cpp/virtual-destructor
* @tags reliability
* readability
* language-features
*/
import cpp
/*
* Find classes with virtual functions that have a destructor that is not virtual and for which there exists a derived class
* when calling the destructor of a derived class the destructor in the base class may not be called
*/
from Class c
where
exists(VirtualFunction f | f.getDeclaringType() = c) and
exists(Destructor d |
d.getDeclaringType() = c and
// Ignore non-public destructors, which prevent an object of the declaring class from being deleted
// directly (except from within the class itself). This is a common pattern in real-world code.
d.hasSpecifier("public") and
not d.isVirtual() and
not d.isDeleted() and
not d.isCompilerGenerated()
) and
exists(ClassDerivation d | d.getBaseClass() = c)
select c, "A base class with a virtual function should define a virtual destructor."