Skip to content

Commit e08790d

Browse files
authored
Merge pull request github#16146 from MathiasVP/missing-destructor-for-parameter
C++: Add example with missing destructor call on parameter
2 parents f08e8b1 + b581a9b commit e08790d

File tree

5 files changed

+189
-0
lines changed

5 files changed

+189
-0
lines changed

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20163,6 +20163,30 @@ ir.cpp:
2016320163
# 2430| Type = [ClassTemplateInstantiation,Struct] iterator<random_access_iterator_tag, char, ptrdiff_t, char *, char &>
2016420164
# 2430| ValueCategory = lvalue
2016520165
# 2432| getStmt(6): [ReturnStmt] return ...
20166+
# 2434| [TopLevelFunction] void param_with_destructor_by_value(ClassWithDestructor)
20167+
# 2434| <params>:
20168+
# 2434| getParameter(0): [Parameter] c
20169+
# 2434| Type = [Class] ClassWithDestructor
20170+
# 2434| getEntryPoint(): [BlockStmt] { ... }
20171+
# 2436| getStmt(0): [ReturnStmt] return ...
20172+
# 2438| [TopLevelFunction] void param_with_destructor_by_pointer(ClassWithDestructor*)
20173+
# 2438| <params>:
20174+
# 2438| getParameter(0): [Parameter] c
20175+
# 2438| Type = [PointerType] ClassWithDestructor *
20176+
# 2438| getEntryPoint(): [BlockStmt] { ... }
20177+
# 2440| getStmt(0): [ReturnStmt] return ...
20178+
# 2442| [TopLevelFunction] void param_with_destructor_by_ref(ClassWithDestructor&)
20179+
# 2442| <params>:
20180+
# 2442| getParameter(0): [Parameter] c
20181+
# 2442| Type = [LValueReferenceType] ClassWithDestructor &
20182+
# 2442| getEntryPoint(): [BlockStmt] { ... }
20183+
# 2444| getStmt(0): [ReturnStmt] return ...
20184+
# 2446| [TopLevelFunction] void param_with_destructor_by_rref(ClassWithDestructor&&)
20185+
# 2446| <params>:
20186+
# 2446| getParameter(0): [Parameter] c
20187+
# 2446| Type = [RValueReferenceType] ClassWithDestructor &&
20188+
# 2446| getEntryPoint(): [BlockStmt] { ... }
20189+
# 2448| getStmt(0): [ReturnStmt] return ...
2016620190
perf-regression.cpp:
2016720191
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
2016820192
# 4| <params>:

cpp/ql/test/library-tests/ir/ir/aliased_ir.expected

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15583,6 +15583,67 @@ ir.cpp:
1558315583
# 2410| Block 13
1558415584
# 2410| v2410_8(void) = Unreached :
1558515585

15586+
# 2434| void param_with_destructor_by_value(ClassWithDestructor)
15587+
# 2434| Block 0
15588+
# 2434| v2434_1(void) = EnterFunction :
15589+
# 2434| m2434_2(unknown) = AliasedDefinition :
15590+
# 2434| m2434_3(unknown) = InitializeNonLocal :
15591+
# 2434| m2434_4(unknown) = Chi : total:m2434_2, partial:m2434_3
15592+
# 2434| r2434_5(glval<ClassWithDestructor>) = VariableAddress[c] :
15593+
# 2434| m2434_6(ClassWithDestructor) = InitializeParameter[c] : &:r2434_5
15594+
# 2436| v2436_1(void) = NoOp :
15595+
# 2434| v2434_7(void) = ReturnVoid :
15596+
# 2434| v2434_8(void) = AliasedUse : m2434_3
15597+
# 2434| v2434_9(void) = ExitFunction :
15598+
15599+
# 2438| void param_with_destructor_by_pointer(ClassWithDestructor*)
15600+
# 2438| Block 0
15601+
# 2438| v2438_1(void) = EnterFunction :
15602+
# 2438| m2438_2(unknown) = AliasedDefinition :
15603+
# 2438| m2438_3(unknown) = InitializeNonLocal :
15604+
# 2438| m2438_4(unknown) = Chi : total:m2438_2, partial:m2438_3
15605+
# 2438| r2438_5(glval<ClassWithDestructor *>) = VariableAddress[c] :
15606+
# 2438| m2438_6(ClassWithDestructor *) = InitializeParameter[c] : &:r2438_5
15607+
# 2438| r2438_7(ClassWithDestructor *) = Load[c] : &:r2438_5, m2438_6
15608+
# 2438| m2438_8(unknown) = InitializeIndirection[c] : &:r2438_7
15609+
# 2440| v2440_1(void) = NoOp :
15610+
# 2438| v2438_9(void) = ReturnIndirection[c] : &:r2438_7, m2438_8
15611+
# 2438| v2438_10(void) = ReturnVoid :
15612+
# 2438| v2438_11(void) = AliasedUse : m2438_3
15613+
# 2438| v2438_12(void) = ExitFunction :
15614+
15615+
# 2442| void param_with_destructor_by_ref(ClassWithDestructor&)
15616+
# 2442| Block 0
15617+
# 2442| v2442_1(void) = EnterFunction :
15618+
# 2442| m2442_2(unknown) = AliasedDefinition :
15619+
# 2442| m2442_3(unknown) = InitializeNonLocal :
15620+
# 2442| m2442_4(unknown) = Chi : total:m2442_2, partial:m2442_3
15621+
# 2442| r2442_5(glval<ClassWithDestructor &>) = VariableAddress[c] :
15622+
# 2442| m2442_6(ClassWithDestructor &) = InitializeParameter[c] : &:r2442_5
15623+
# 2442| r2442_7(ClassWithDestructor &) = Load[c] : &:r2442_5, m2442_6
15624+
# 2442| m2442_8(unknown) = InitializeIndirection[c] : &:r2442_7
15625+
# 2444| v2444_1(void) = NoOp :
15626+
# 2442| v2442_9(void) = ReturnIndirection[c] : &:r2442_7, m2442_8
15627+
# 2442| v2442_10(void) = ReturnVoid :
15628+
# 2442| v2442_11(void) = AliasedUse : m2442_3
15629+
# 2442| v2442_12(void) = ExitFunction :
15630+
15631+
# 2446| void param_with_destructor_by_rref(ClassWithDestructor&&)
15632+
# 2446| Block 0
15633+
# 2446| v2446_1(void) = EnterFunction :
15634+
# 2446| m2446_2(unknown) = AliasedDefinition :
15635+
# 2446| m2446_3(unknown) = InitializeNonLocal :
15636+
# 2446| m2446_4(unknown) = Chi : total:m2446_2, partial:m2446_3
15637+
# 2446| r2446_5(glval<ClassWithDestructor &&>) = VariableAddress[c] :
15638+
# 2446| m2446_6(ClassWithDestructor &&) = InitializeParameter[c] : &:r2446_5
15639+
# 2446| r2446_7(ClassWithDestructor &&) = Load[c] : &:r2446_5, m2446_6
15640+
# 2446| m2446_8(unknown) = InitializeIndirection[c] : &:r2446_7
15641+
# 2448| v2448_1(void) = NoOp :
15642+
# 2446| v2446_9(void) = ReturnIndirection[c] : &:r2446_7, m2446_8
15643+
# 2446| v2446_10(void) = ReturnVoid :
15644+
# 2446| v2446_11(void) = AliasedUse : m2446_3
15645+
# 2446| v2446_12(void) = ExitFunction :
15646+
1558615647
perf-regression.cpp:
1558715648
# 6| void Big::Big()
1558815649
# 6| Block 0

cpp/ql/test/library-tests/ir/ir/ir.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2431,4 +2431,20 @@ void initialization_with_temp_destructor() {
24312431
y += x;
24322432
}
24332433

2434+
void param_with_destructor_by_value(ClassWithDestructor c) {
2435+
// The call to ~ClassWithDestructor::ClassWithDestructor() seems to be missing here.
2436+
}
2437+
2438+
void param_with_destructor_by_pointer(ClassWithDestructor* c) {
2439+
// No destructor call should be here
2440+
}
2441+
2442+
void param_with_destructor_by_ref(ClassWithDestructor& c) {
2443+
// No destructor call should be here
2444+
}
2445+
2446+
void param_with_destructor_by_rref(ClassWithDestructor&& c) {
2447+
// No destructor call should be here
2448+
}
2449+
24342450
// semmle-extractor-options: -std=c++20 --clang

cpp/ql/test/library-tests/ir/ir/operand_locations.expected

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12968,6 +12968,37 @@
1296812968
| ir.cpp:2431:14:2431:14 | Load | m2430_17 |
1296912969
| ir.cpp:2431:14:2431:14 | Right | r2431_3 |
1297012970
| ir.cpp:2431:14:2431:14 | Unary | r2431_2 |
12971+
| ir.cpp:2434:6:2434:35 | ChiPartial | partial:m2434_3 |
12972+
| ir.cpp:2434:6:2434:35 | ChiTotal | total:m2434_2 |
12973+
| ir.cpp:2434:6:2434:35 | SideEffect | m2434_3 |
12974+
| ir.cpp:2434:57:2434:57 | Address | &:r2434_5 |
12975+
| ir.cpp:2438:6:2438:37 | ChiPartial | partial:m2438_3 |
12976+
| ir.cpp:2438:6:2438:37 | ChiTotal | total:m2438_2 |
12977+
| ir.cpp:2438:6:2438:37 | SideEffect | m2438_3 |
12978+
| ir.cpp:2438:60:2438:60 | Address | &:r2438_5 |
12979+
| ir.cpp:2438:60:2438:60 | Address | &:r2438_5 |
12980+
| ir.cpp:2438:60:2438:60 | Address | &:r2438_7 |
12981+
| ir.cpp:2438:60:2438:60 | Address | &:r2438_7 |
12982+
| ir.cpp:2438:60:2438:60 | Load | m2438_6 |
12983+
| ir.cpp:2438:60:2438:60 | SideEffect | m2438_8 |
12984+
| ir.cpp:2442:6:2442:33 | ChiPartial | partial:m2442_3 |
12985+
| ir.cpp:2442:6:2442:33 | ChiTotal | total:m2442_2 |
12986+
| ir.cpp:2442:6:2442:33 | SideEffect | m2442_3 |
12987+
| ir.cpp:2442:56:2442:56 | Address | &:r2442_5 |
12988+
| ir.cpp:2442:56:2442:56 | Address | &:r2442_5 |
12989+
| ir.cpp:2442:56:2442:56 | Address | &:r2442_7 |
12990+
| ir.cpp:2442:56:2442:56 | Address | &:r2442_7 |
12991+
| ir.cpp:2442:56:2442:56 | Load | m2442_6 |
12992+
| ir.cpp:2442:56:2442:56 | SideEffect | m2442_8 |
12993+
| ir.cpp:2446:6:2446:34 | ChiPartial | partial:m2446_3 |
12994+
| ir.cpp:2446:6:2446:34 | ChiTotal | total:m2446_2 |
12995+
| ir.cpp:2446:6:2446:34 | SideEffect | m2446_3 |
12996+
| ir.cpp:2446:58:2446:58 | Address | &:r2446_5 |
12997+
| ir.cpp:2446:58:2446:58 | Address | &:r2446_5 |
12998+
| ir.cpp:2446:58:2446:58 | Address | &:r2446_7 |
12999+
| ir.cpp:2446:58:2446:58 | Address | &:r2446_7 |
13000+
| ir.cpp:2446:58:2446:58 | Load | m2446_6 |
13001+
| ir.cpp:2446:58:2446:58 | SideEffect | m2446_8 |
1297113002
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
1297213003
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
1297313004
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |

cpp/ql/test/library-tests/ir/ir/raw_ir.expected

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14362,6 +14362,63 @@ ir.cpp:
1436214362
# 2410| v2410_5(void) = AliasedUse : ~m?
1436314363
# 2410| v2410_6(void) = ExitFunction :
1436414364

14365+
# 2434| void param_with_destructor_by_value(ClassWithDestructor)
14366+
# 2434| Block 0
14367+
# 2434| v2434_1(void) = EnterFunction :
14368+
# 2434| mu2434_2(unknown) = AliasedDefinition :
14369+
# 2434| mu2434_3(unknown) = InitializeNonLocal :
14370+
# 2434| r2434_4(glval<ClassWithDestructor>) = VariableAddress[c] :
14371+
# 2434| mu2434_5(ClassWithDestructor) = InitializeParameter[c] : &:r2434_4
14372+
# 2436| v2436_1(void) = NoOp :
14373+
# 2434| v2434_6(void) = ReturnVoid :
14374+
# 2434| v2434_7(void) = AliasedUse : ~m?
14375+
# 2434| v2434_8(void) = ExitFunction :
14376+
14377+
# 2438| void param_with_destructor_by_pointer(ClassWithDestructor*)
14378+
# 2438| Block 0
14379+
# 2438| v2438_1(void) = EnterFunction :
14380+
# 2438| mu2438_2(unknown) = AliasedDefinition :
14381+
# 2438| mu2438_3(unknown) = InitializeNonLocal :
14382+
# 2438| r2438_4(glval<ClassWithDestructor *>) = VariableAddress[c] :
14383+
# 2438| mu2438_5(ClassWithDestructor *) = InitializeParameter[c] : &:r2438_4
14384+
# 2438| r2438_6(ClassWithDestructor *) = Load[c] : &:r2438_4, ~m?
14385+
# 2438| mu2438_7(unknown) = InitializeIndirection[c] : &:r2438_6
14386+
# 2440| v2440_1(void) = NoOp :
14387+
# 2438| v2438_8(void) = ReturnIndirection[c] : &:r2438_6, ~m?
14388+
# 2438| v2438_9(void) = ReturnVoid :
14389+
# 2438| v2438_10(void) = AliasedUse : ~m?
14390+
# 2438| v2438_11(void) = ExitFunction :
14391+
14392+
# 2442| void param_with_destructor_by_ref(ClassWithDestructor&)
14393+
# 2442| Block 0
14394+
# 2442| v2442_1(void) = EnterFunction :
14395+
# 2442| mu2442_2(unknown) = AliasedDefinition :
14396+
# 2442| mu2442_3(unknown) = InitializeNonLocal :
14397+
# 2442| r2442_4(glval<ClassWithDestructor &>) = VariableAddress[c] :
14398+
# 2442| mu2442_5(ClassWithDestructor &) = InitializeParameter[c] : &:r2442_4
14399+
# 2442| r2442_6(ClassWithDestructor &) = Load[c] : &:r2442_4, ~m?
14400+
# 2442| mu2442_7(unknown) = InitializeIndirection[c] : &:r2442_6
14401+
# 2444| v2444_1(void) = NoOp :
14402+
# 2442| v2442_8(void) = ReturnIndirection[c] : &:r2442_6, ~m?
14403+
# 2442| v2442_9(void) = ReturnVoid :
14404+
# 2442| v2442_10(void) = AliasedUse : ~m?
14405+
# 2442| v2442_11(void) = ExitFunction :
14406+
14407+
# 2446| void param_with_destructor_by_rref(ClassWithDestructor&&)
14408+
# 2446| Block 0
14409+
# 2446| v2446_1(void) = EnterFunction :
14410+
# 2446| mu2446_2(unknown) = AliasedDefinition :
14411+
# 2446| mu2446_3(unknown) = InitializeNonLocal :
14412+
# 2446| r2446_4(glval<ClassWithDestructor &&>) = VariableAddress[c] :
14413+
# 2446| mu2446_5(ClassWithDestructor &&) = InitializeParameter[c] : &:r2446_4
14414+
# 2446| r2446_6(ClassWithDestructor &&) = Load[c] : &:r2446_4, ~m?
14415+
# 2446| mu2446_7(unknown) = InitializeIndirection[c] : &:r2446_6
14416+
# 2448| v2448_1(void) = NoOp :
14417+
# 2446| v2446_8(void) = ReturnIndirection[c] : &:r2446_6, ~m?
14418+
# 2446| v2446_9(void) = ReturnVoid :
14419+
# 2446| v2446_10(void) = AliasedUse : ~m?
14420+
# 2446| v2446_11(void) = ExitFunction :
14421+
1436514422
perf-regression.cpp:
1436614423
# 6| void Big::Big()
1436714424
# 6| Block 0

0 commit comments

Comments
 (0)