Skip to content

Commit 18e60fa

Browse files
committed
C++: Model operator delete and operator delete[].
1 parent 3b12d1a commit 18e60fa

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,27 @@ class StandardDeallocationFunction extends DeallocationFunction {
7979
override int getFreedArg() { result = freedArg }
8080
}
8181

82+
/**
83+
* An `operator delete` or `operator delete[]` function that may be associated
84+
* with a `delete` or `delete[]` expression. Note that `delete` and `delete[]`
85+
* are not function calls, but these functions may also be called directly.
86+
*/
87+
class OperatorDeleteDeallocationFunction extends DeallocationFunction {
88+
OperatorDeleteDeallocationFunction() {
89+
exists(string name |
90+
hasGlobalOrStdName(name) and
91+
(
92+
// operator delete(pointer, ...)
93+
name = "operator delete" or
94+
// operator delete[](pointer, ...)
95+
name = "operator delete[]"
96+
)
97+
)
98+
}
99+
100+
override int getFreedArg() { result = 0 }
101+
}
102+
82103
/**
83104
* An deallocation expression that is a function call, such as call to `free`.
84105
*/

cpp/ql/test/library-tests/allocators/allocators.expected

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,15 @@ allocationExprs
8585
| allocators.cpp:144:13:144:31 | new[] | getSizeExpr = x, getSizeMult = 900, requiresDealloc |
8686
| allocators.cpp:149:8:149:19 | call to operator new | getSizeBytes = 4, getSizeExpr = sizeof(int), getSizeMult = 1, requiresDealloc |
8787
deallocationFunctions
88+
| allocators.cpp:11:6:11:20 | operator delete | getFreedArg = 0 |
89+
| allocators.cpp:12:6:12:22 | operator delete[] | getFreedArg = 0 |
90+
| allocators.cpp:13:6:13:20 | operator delete | getFreedArg = 0 |
91+
| allocators.cpp:14:6:14:22 | operator delete[] | getFreedArg = 0 |
92+
| file://:0:0:0:0 | operator delete | getFreedArg = 0 |
93+
| file://:0:0:0:0 | operator delete | getFreedArg = 0 |
94+
| file://:0:0:0:0 | operator delete | getFreedArg = 0 |
95+
| file://:0:0:0:0 | operator delete[] | getFreedArg = 0 |
96+
| file://:0:0:0:0 | operator delete[] | getFreedArg = 0 |
8897
deallocationExprs
8998
| allocators.cpp:59:3:59:35 | delete | getFreedExpr = 0 |
9099
| allocators.cpp:60:3:60:38 | delete | getFreedExpr = 0 |
@@ -98,3 +107,4 @@ deallocationExprs
98107
| allocators.cpp:81:3:81:45 | delete[] | getFreedExpr = 0 |
99108
| allocators.cpp:82:3:82:49 | delete[] | getFreedExpr = 0 |
100109
| allocators.cpp:83:3:83:23 | delete[] | getFreedExpr = call to GetPointer |
110+
| allocators.cpp:150:2:150:16 | call to operator delete | getFreedExpr = ptr |

0 commit comments

Comments
 (0)