From 97cdcbee6388947c3a66da8a0cd5e6ec37d520b9 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 13:52:16 +0100 Subject: [PATCH 01/11] C++: Test for NewFreeMismatch.ql with operator new / delete. --- .../Critical/NewFree/NewFreeMismatch.expected | 4 ++++ .../query-tests/Critical/NewFree/test2.cpp | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected b/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected index 7350749ce962..d588fc26e7b5 100644 --- a/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected +++ b/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected @@ -1,5 +1,9 @@ | test2.cpp:19:3:19:6 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:18:12:18:18 | new | new | | test2.cpp:26:3:26:6 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:25:7:25:13 | new | new | +| test2.cpp:50:2:50:18 | call to operator delete | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:45:18:45:24 | new | new | +| test2.cpp:51:2:51:5 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:45:18:45:24 | new | new | +| test2.cpp:53:2:53:17 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test2.cpp:46:20:46:33 | call to operator new | malloc | +| test2.cpp:57:2:57:18 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test2.cpp:47:21:47:26 | call to malloc | malloc | | test.cpp:36:2:36:17 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test.cpp:27:18:27:23 | call to malloc | malloc | | test.cpp:41:2:41:5 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test.cpp:26:7:26:17 | new | new | | test.cpp:68:3:68:11 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test.cpp:64:28:64:33 | call to malloc | malloc | diff --git a/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp b/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp index 9101758d85b3..15ab818d2c63 100644 --- a/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp +++ b/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp @@ -34,3 +34,27 @@ class MyTest2Class }; MyTest2Class mt2c_i; + +// --- + +void* operator new(size_t); +void operator delete(void*); + +void test_operator_new() +{ + void *ptr_new = new int; + void *ptr_opnew = ::operator new(sizeof(int)); + void *ptr_malloc = malloc(sizeof(int)); + + delete ptr_new; // GOOD + ::operator delete(ptr_new); // GOOD [FALSE POSITIVE] + free(ptr_new); // BAD + + delete ptr_opnew; // GOOD [FALSE POSITIVE] + ::operator delete(ptr_opnew); // GOOD + free(ptr_opnew); // BAD [NOT DETECTED] + + delete ptr_malloc; // BAD + ::operator delete(ptr_malloc); // BAD [NOT DETECTED] + free(ptr_malloc); // GOOD +} From 3e9f9645aecd8ad778ff9bcc97f098da0e7b985c Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 11:30:14 +0100 Subject: [PATCH 02/11] C++: Exclude calls to operator new / delete from NewFreeMismatch.ql. --- cpp/ql/src/Critical/NewDelete.qll | 4 ++++ .../query-tests/Critical/NewFree/NewFreeMismatch.expected | 2 -- cpp/ql/test/query-tests/Critical/NewFree/test2.cpp | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cpp/ql/src/Critical/NewDelete.qll b/cpp/ql/src/Critical/NewDelete.qll index 9dd55525b59a..7650af2f0534 100644 --- a/cpp/ql/src/Critical/NewDelete.qll +++ b/cpp/ql/src/Critical/NewDelete.qll @@ -5,6 +5,8 @@ import cpp import semmle.code.cpp.controlflow.SSA import semmle.code.cpp.dataflow.DataFlow +import semmle.code.cpp.models.implementations.Allocation +import semmle.code.cpp.models.implementations.Deallocation /** * Holds if `alloc` is a use of `malloc` or `new`. `kind` is @@ -15,6 +17,7 @@ predicate allocExpr(Expr alloc, string kind) { not alloc.isFromUninstantiatedTemplate(_) and ( alloc instanceof FunctionCall and + not alloc.(FunctionCall).getTarget() instanceof OperatorNewAllocationFunction and kind = "malloc" or alloc instanceof NewExpr and @@ -111,6 +114,7 @@ predicate allocReaches(Expr e, Expr alloc, string kind) { */ predicate freeExpr(Expr free, Expr freed, string kind) { freeCall(free, freed) and + not free.(FunctionCall).getTarget() instanceof OperatorDeleteDeallocationFunction and kind = "free" or free.(DeleteExpr).getExpr() = freed and diff --git a/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected b/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected index d588fc26e7b5..8bcb9efa5879 100644 --- a/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected +++ b/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected @@ -1,8 +1,6 @@ | test2.cpp:19:3:19:6 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:18:12:18:18 | new | new | | test2.cpp:26:3:26:6 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:25:7:25:13 | new | new | -| test2.cpp:50:2:50:18 | call to operator delete | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:45:18:45:24 | new | new | | test2.cpp:51:2:51:5 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:45:18:45:24 | new | new | -| test2.cpp:53:2:53:17 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test2.cpp:46:20:46:33 | call to operator new | malloc | | test2.cpp:57:2:57:18 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test2.cpp:47:21:47:26 | call to malloc | malloc | | test.cpp:36:2:36:17 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test.cpp:27:18:27:23 | call to malloc | malloc | | test.cpp:41:2:41:5 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test.cpp:26:7:26:17 | new | new | diff --git a/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp b/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp index 15ab818d2c63..d5abd62ab713 100644 --- a/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp +++ b/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp @@ -47,10 +47,10 @@ void test_operator_new() void *ptr_malloc = malloc(sizeof(int)); delete ptr_new; // GOOD - ::operator delete(ptr_new); // GOOD [FALSE POSITIVE] + ::operator delete(ptr_new); // GOOD free(ptr_new); // BAD - delete ptr_opnew; // GOOD [FALSE POSITIVE] + delete ptr_opnew; // GOOD ::operator delete(ptr_opnew); // GOOD free(ptr_opnew); // BAD [NOT DETECTED] From 8059d69bbd754b7d26e93cfc109254e680e03b98 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 14:24:16 +0100 Subject: [PATCH 03/11] C++: Model calls to operator new / delete for NewFreeMismatch.ql. --- cpp/ql/src/Critical/NewDelete.qll | 33 +++++++++++++++---- .../Critical/NewFree/NewFreeMismatch.expected | 2 ++ .../query-tests/Critical/NewFree/test2.cpp | 4 +-- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/cpp/ql/src/Critical/NewDelete.qll b/cpp/ql/src/Critical/NewDelete.qll index 7650af2f0534..93d4ca0973c9 100644 --- a/cpp/ql/src/Critical/NewDelete.qll +++ b/cpp/ql/src/Critical/NewDelete.qll @@ -16,9 +16,19 @@ predicate allocExpr(Expr alloc, string kind) { isAllocationExpr(alloc) and not alloc.isFromUninstantiatedTemplate(_) and ( - alloc instanceof FunctionCall and - not alloc.(FunctionCall).getTarget() instanceof OperatorNewAllocationFunction and - kind = "malloc" + exists(Function target | + alloc.(FunctionCall).getTarget() = target and + ( + target.getName() = "operator new" and + kind = "new" + or + target.getName() = "operator new[]" and + kind = "new[]" + or + not target instanceof OperatorNewAllocationFunction and + kind = "malloc" + ) + ) or alloc instanceof NewExpr and kind = "new" and @@ -113,9 +123,20 @@ predicate allocReaches(Expr e, Expr alloc, string kind) { * describing the type of that free or delete. */ predicate freeExpr(Expr free, Expr freed, string kind) { - freeCall(free, freed) and - not free.(FunctionCall).getTarget() instanceof OperatorDeleteDeallocationFunction and - kind = "free" + exists(Function target | + freeCall(free, freed) and + free.(FunctionCall).getTarget() = target and + ( + target.getName() = "operator delete" and + kind = "delete" + or + target.getName() = "operator delete[]" and + kind = "delete[]" + or + not target instanceof OperatorDeleteDeallocationFunction and + kind = "free" + ) + ) or free.(DeleteExpr).getExpr() = freed and kind = "delete" diff --git a/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected b/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected index 8bcb9efa5879..45f88d426c98 100644 --- a/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected +++ b/cpp/ql/test/query-tests/Critical/NewFree/NewFreeMismatch.expected @@ -1,7 +1,9 @@ | test2.cpp:19:3:19:6 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:18:12:18:18 | new | new | | test2.cpp:26:3:26:6 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:25:7:25:13 | new | new | | test2.cpp:51:2:51:5 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:45:18:45:24 | new | new | +| test2.cpp:55:2:55:5 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test2.cpp:46:20:46:33 | call to operator new | new | | test2.cpp:57:2:57:18 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test2.cpp:47:21:47:26 | call to malloc | malloc | +| test2.cpp:58:2:58:18 | call to operator delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test2.cpp:47:21:47:26 | call to malloc | malloc | | test.cpp:36:2:36:17 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test.cpp:27:18:27:23 | call to malloc | malloc | | test.cpp:41:2:41:5 | call to free | There is a new/free mismatch between this free and the corresponding $@. | test.cpp:26:7:26:17 | new | new | | test.cpp:68:3:68:11 | delete | There is a malloc/delete mismatch between this delete and the corresponding $@. | test.cpp:64:28:64:33 | call to malloc | malloc | diff --git a/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp b/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp index d5abd62ab713..43a286f6f97f 100644 --- a/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp +++ b/cpp/ql/test/query-tests/Critical/NewFree/test2.cpp @@ -52,9 +52,9 @@ void test_operator_new() delete ptr_opnew; // GOOD ::operator delete(ptr_opnew); // GOOD - free(ptr_opnew); // BAD [NOT DETECTED] + free(ptr_opnew); // BAD delete ptr_malloc; // BAD - ::operator delete(ptr_malloc); // BAD [NOT DETECTED] + ::operator delete(ptr_malloc); // BAD free(ptr_malloc); // GOOD } From e223557201d5326af4ee91c59a28815fc5694695 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 14:32:15 +0100 Subject: [PATCH 04/11] C++: Wean NewDelete.qll off the legacy wrapper Alloc.qll. --- cpp/ql/src/Critical/NewDelete.qll | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cpp/ql/src/Critical/NewDelete.qll b/cpp/ql/src/Critical/NewDelete.qll index 93d4ca0973c9..1670dfc1357f 100644 --- a/cpp/ql/src/Critical/NewDelete.qll +++ b/cpp/ql/src/Critical/NewDelete.qll @@ -13,8 +13,11 @@ import semmle.code.cpp.models.implementations.Deallocation * a string describing the type of the allocation. */ predicate allocExpr(Expr alloc, string kind) { - isAllocationExpr(alloc) and - not alloc.isFromUninstantiatedTemplate(_) and + ( + alloc.(FunctionCall) instanceof AllocationExpr + or + alloc = any(NewOrNewArrayExpr new | not exists(new.getPlacementPointer())) + ) and ( exists(Function target | alloc.(FunctionCall).getTarget() = target and @@ -41,7 +44,8 @@ predicate allocExpr(Expr alloc, string kind) { // exclude placement new and custom overloads as they // may not conform to assumptions not alloc.(NewArrayExpr).getAllocatorCall().getTarget().getNumberOfParameters() > 1 - ) + ) and + not alloc.isFromUninstantiatedTemplate(_) } /** @@ -124,7 +128,7 @@ predicate allocReaches(Expr e, Expr alloc, string kind) { */ predicate freeExpr(Expr free, Expr freed, string kind) { exists(Function target | - freeCall(free, freed) and + freed = free.(DeallocationExpr).getFreedExpr() and free.(FunctionCall).getTarget() = target and ( target.getName() = "operator delete" and From cbe133d0e6da1b8b1a6232818c84464307eda974 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 14:32:49 +0100 Subject: [PATCH 05/11] C++: Deprecate freeCall in the legacy wrapper Alloc.qll. --- cpp/ql/src/Critical/MemoryFreed.qll | 2 +- cpp/ql/src/semmle/code/cpp/commons/Alloc.qll | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cpp/ql/src/Critical/MemoryFreed.qll b/cpp/ql/src/Critical/MemoryFreed.qll index d548aca26e7c..880199e54c9f 100644 --- a/cpp/ql/src/Critical/MemoryFreed.qll +++ b/cpp/ql/src/Critical/MemoryFreed.qll @@ -4,7 +4,7 @@ private predicate freed(Expr e) { e = any(DeallocationExpr de).getFreedExpr() or exists(ExprCall c | - // cautiously assume that any ExprCall could be a freeCall. + // cautiously assume that any `ExprCall` could be a deallocation expression. c.getAnArgument() = e ) } diff --git a/cpp/ql/src/semmle/code/cpp/commons/Alloc.qll b/cpp/ql/src/semmle/code/cpp/commons/Alloc.qll index a508c929d9ae..a9597fc72b5a 100644 --- a/cpp/ql/src/semmle/code/cpp/commons/Alloc.qll +++ b/cpp/ql/src/semmle/code/cpp/commons/Alloc.qll @@ -23,6 +23,8 @@ predicate freeFunction(Function f, int argNum) { argNum = f.(DeallocationFunctio /** * A call to a library routine that frees memory. + * + * DEPRECATED: Use `DeallocationExpr` instead (this also includes `delete` expressions). */ predicate freeCall(FunctionCall fc, Expr arg) { arg = fc.(DeallocationExpr).getFreedExpr() } From 050e2395072a38c9ab8834d6c360d6aa3331a780 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 14:37:47 +0100 Subject: [PATCH 06/11] C++: Change note. --- change-notes/1.24/analysis-cpp.md | 1 + 1 file changed, 1 insertion(+) diff --git a/change-notes/1.24/analysis-cpp.md b/change-notes/1.24/analysis-cpp.md index 2b53e6d56aa7..73d58a57404e 100644 --- a/change-notes/1.24/analysis-cpp.md +++ b/change-notes/1.24/analysis-cpp.md @@ -53,3 +53,4 @@ The following changes in version 1.24 affect C/C++ analysis in all applications. * The library now models data flow through formatting functions such as `sprintf`. * The security pack taint tracking library (`semmle.code.cpp.security.TaintTracking`) uses a new intermediate representation. This provides a more precise analysis of pointers to stack variables and flow through parameters, improving the results of many security queries. * The global value numbering library (`semmle.code.cpp.valuenumbering.GlobalValueNumbering`) uses a new intermediate representation to provide a more precise analysis of heap allocated memory and pointers to stack variables. +* `freeCall` in `semmle.code.cpp.commons.Alloc` has been deprecated. The`Allocation` and `Deallocation` models in `semmle.code.cpp.models.interfaces` should be used instead. From 492c5f367f7f4c4fe142c9e6d79040df0738ffbe Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 14:44:38 +0100 Subject: [PATCH 07/11] C++: Simplify NewDelete.qll. --- cpp/ql/src/Critical/NewDelete.qll | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cpp/ql/src/Critical/NewDelete.qll b/cpp/ql/src/Critical/NewDelete.qll index 1670dfc1357f..b9c84c04a3a2 100644 --- a/cpp/ql/src/Critical/NewDelete.qll +++ b/cpp/ql/src/Critical/NewDelete.qll @@ -13,14 +13,9 @@ import semmle.code.cpp.models.implementations.Deallocation * a string describing the type of the allocation. */ predicate allocExpr(Expr alloc, string kind) { - ( - alloc.(FunctionCall) instanceof AllocationExpr - or - alloc = any(NewOrNewArrayExpr new | not exists(new.getPlacementPointer())) - ) and ( exists(Function target | - alloc.(FunctionCall).getTarget() = target and + alloc.(AllocationExpr).(FunctionCall).getTarget() = target and ( target.getName() = "operator new" and kind = "new" From a71ae2b4687d60818f041a3aa1e5bd240b2d2f30 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 6 Apr 2020 14:46:00 +0100 Subject: [PATCH 08/11] C++: Consistent treatment of placement new. --- cpp/ql/src/Critical/NewDelete.qll | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/Critical/NewDelete.qll b/cpp/ql/src/Critical/NewDelete.qll index b9c84c04a3a2..30b9f9ad94ad 100644 --- a/cpp/ql/src/Critical/NewDelete.qll +++ b/cpp/ql/src/Critical/NewDelete.qll @@ -18,10 +18,16 @@ predicate allocExpr(Expr alloc, string kind) { alloc.(AllocationExpr).(FunctionCall).getTarget() = target and ( target.getName() = "operator new" and - kind = "new" + kind = "new" and + // exclude placement new and custom overloads as they + // may not conform to assumptions + not target.getNumberOfParameters() > 1 or target.getName() = "operator new[]" and - kind = "new[]" + kind = "new[]" and + // exclude placement new and custom overloads as they + // may not conform to assumptions + not target.getNumberOfParameters() > 1 or not target instanceof OperatorNewAllocationFunction and kind = "malloc" From 2686d9888cdfdc12eb14b7685cb806b5d39897ef Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 7 Apr 2020 18:10:56 +0100 Subject: [PATCH 09/11] C++: Add QLDoc. --- .../semmle/code/cpp/models/implementations/Allocation.qll | 8 +++++++- .../code/cpp/models/implementations/Deallocation.qll | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll index c6766983889c..d2577dc3ca48 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll @@ -1,4 +1,10 @@ -import semmle.code.cpp.models.interfaces.Allocation +/** + * Provides implementation classes modelling various methods of allocation + * (`malloc`, `new` etc). See `semmle.code.cpp.models.interfaces.Allocation` + * for usage information. + */ + + import semmle.code.cpp.models.interfaces.Allocation /** * An allocation function (such as `malloc`) that has an argument for the size diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll index d2e4951e436a..6637c6e1b263 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll @@ -1,4 +1,10 @@ -import semmle.code.cpp.models.interfaces.Allocation +/** + * Provides implementation classes modelling various methods of deallocation + * (`free`, `delete` etc). See `semmle.code.cpp.models.interfaces.Deallocation` + * for usage information. + */ + + import semmle.code.cpp.models.interfaces.Allocation /** * A deallocation function such as `free`. From 50194f372b8a55bce887288d7916837873ef89b8 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 7 Apr 2020 20:54:54 +0100 Subject: [PATCH 10/11] C++: Autoformat. --- .../src/semmle/code/cpp/models/implementations/Allocation.qll | 2 +- .../src/semmle/code/cpp/models/implementations/Deallocation.qll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll index d2577dc3ca48..f6f7ab279a68 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/Allocation.qll @@ -4,7 +4,7 @@ * for usage information. */ - import semmle.code.cpp.models.interfaces.Allocation +import semmle.code.cpp.models.interfaces.Allocation /** * An allocation function (such as `malloc`) that has an argument for the size diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll index 6637c6e1b263..60076ed28d70 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll @@ -4,7 +4,7 @@ * for usage information. */ - import semmle.code.cpp.models.interfaces.Allocation +import semmle.code.cpp.models.interfaces.Allocation /** * A deallocation function such as `free`. From 7fedac3266f8bbcfda9d5892c01eb5c158391746 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 7 Apr 2020 20:56:07 +0100 Subject: [PATCH 11/11] C++: Fix apparently noncritical typo. --- .../src/semmle/code/cpp/models/implementations/Deallocation.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll index 60076ed28d70..980645df0312 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/Deallocation.qll @@ -4,7 +4,7 @@ * for usage information. */ -import semmle.code.cpp.models.interfaces.Allocation +import semmle.code.cpp.models.interfaces.Deallocation /** * A deallocation function such as `free`.