C++: Add example with missing destructor calls on parameters passed by value.

This commit is contained in:
Mathias Vorreiter Pedersen
2024-04-08 13:49:05 +01:00
parent aa24c29395
commit b581a9ba04
5 changed files with 189 additions and 0 deletions

View File

@@ -20163,6 +20163,30 @@ ir.cpp:
# 2430| Type = [ClassTemplateInstantiation,Struct] iterator<random_access_iterator_tag, char, ptrdiff_t, char *, char &>
# 2430| ValueCategory = lvalue
# 2432| getStmt(6): [ReturnStmt] return ...
# 2434| [TopLevelFunction] void param_with_destructor_by_value(ClassWithDestructor)
# 2434| <params>:
# 2434| getParameter(0): [Parameter] c
# 2434| Type = [Class] ClassWithDestructor
# 2434| getEntryPoint(): [BlockStmt] { ... }
# 2436| getStmt(0): [ReturnStmt] return ...
# 2438| [TopLevelFunction] void param_with_destructor_by_pointer(ClassWithDestructor*)
# 2438| <params>:
# 2438| getParameter(0): [Parameter] c
# 2438| Type = [PointerType] ClassWithDestructor *
# 2438| getEntryPoint(): [BlockStmt] { ... }
# 2440| getStmt(0): [ReturnStmt] return ...
# 2442| [TopLevelFunction] void param_with_destructor_by_ref(ClassWithDestructor&)
# 2442| <params>:
# 2442| getParameter(0): [Parameter] c
# 2442| Type = [LValueReferenceType] ClassWithDestructor &
# 2442| getEntryPoint(): [BlockStmt] { ... }
# 2444| getStmt(0): [ReturnStmt] return ...
# 2446| [TopLevelFunction] void param_with_destructor_by_rref(ClassWithDestructor&&)
# 2446| <params>:
# 2446| getParameter(0): [Parameter] c
# 2446| Type = [RValueReferenceType] ClassWithDestructor &&
# 2446| getEntryPoint(): [BlockStmt] { ... }
# 2448| getStmt(0): [ReturnStmt] return ...
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -15583,6 +15583,67 @@ ir.cpp:
# 2410| Block 13
# 2410| v2410_8(void) = Unreached :
# 2434| void param_with_destructor_by_value(ClassWithDestructor)
# 2434| Block 0
# 2434| v2434_1(void) = EnterFunction :
# 2434| m2434_2(unknown) = AliasedDefinition :
# 2434| m2434_3(unknown) = InitializeNonLocal :
# 2434| m2434_4(unknown) = Chi : total:m2434_2, partial:m2434_3
# 2434| r2434_5(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2434| m2434_6(ClassWithDestructor) = InitializeParameter[c] : &:r2434_5
# 2436| v2436_1(void) = NoOp :
# 2434| v2434_7(void) = ReturnVoid :
# 2434| v2434_8(void) = AliasedUse : m2434_3
# 2434| v2434_9(void) = ExitFunction :
# 2438| void param_with_destructor_by_pointer(ClassWithDestructor*)
# 2438| Block 0
# 2438| v2438_1(void) = EnterFunction :
# 2438| m2438_2(unknown) = AliasedDefinition :
# 2438| m2438_3(unknown) = InitializeNonLocal :
# 2438| m2438_4(unknown) = Chi : total:m2438_2, partial:m2438_3
# 2438| r2438_5(glval<ClassWithDestructor *>) = VariableAddress[c] :
# 2438| m2438_6(ClassWithDestructor *) = InitializeParameter[c] : &:r2438_5
# 2438| r2438_7(ClassWithDestructor *) = Load[c] : &:r2438_5, m2438_6
# 2438| m2438_8(unknown) = InitializeIndirection[c] : &:r2438_7
# 2440| v2440_1(void) = NoOp :
# 2438| v2438_9(void) = ReturnIndirection[c] : &:r2438_7, m2438_8
# 2438| v2438_10(void) = ReturnVoid :
# 2438| v2438_11(void) = AliasedUse : m2438_3
# 2438| v2438_12(void) = ExitFunction :
# 2442| void param_with_destructor_by_ref(ClassWithDestructor&)
# 2442| Block 0
# 2442| v2442_1(void) = EnterFunction :
# 2442| m2442_2(unknown) = AliasedDefinition :
# 2442| m2442_3(unknown) = InitializeNonLocal :
# 2442| m2442_4(unknown) = Chi : total:m2442_2, partial:m2442_3
# 2442| r2442_5(glval<ClassWithDestructor &>) = VariableAddress[c] :
# 2442| m2442_6(ClassWithDestructor &) = InitializeParameter[c] : &:r2442_5
# 2442| r2442_7(ClassWithDestructor &) = Load[c] : &:r2442_5, m2442_6
# 2442| m2442_8(unknown) = InitializeIndirection[c] : &:r2442_7
# 2444| v2444_1(void) = NoOp :
# 2442| v2442_9(void) = ReturnIndirection[c] : &:r2442_7, m2442_8
# 2442| v2442_10(void) = ReturnVoid :
# 2442| v2442_11(void) = AliasedUse : m2442_3
# 2442| v2442_12(void) = ExitFunction :
# 2446| void param_with_destructor_by_rref(ClassWithDestructor&&)
# 2446| Block 0
# 2446| v2446_1(void) = EnterFunction :
# 2446| m2446_2(unknown) = AliasedDefinition :
# 2446| m2446_3(unknown) = InitializeNonLocal :
# 2446| m2446_4(unknown) = Chi : total:m2446_2, partial:m2446_3
# 2446| r2446_5(glval<ClassWithDestructor &&>) = VariableAddress[c] :
# 2446| m2446_6(ClassWithDestructor &&) = InitializeParameter[c] : &:r2446_5
# 2446| r2446_7(ClassWithDestructor &&) = Load[c] : &:r2446_5, m2446_6
# 2446| m2446_8(unknown) = InitializeIndirection[c] : &:r2446_7
# 2448| v2448_1(void) = NoOp :
# 2446| v2446_9(void) = ReturnIndirection[c] : &:r2446_7, m2446_8
# 2446| v2446_10(void) = ReturnVoid :
# 2446| v2446_11(void) = AliasedUse : m2446_3
# 2446| v2446_12(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -2431,4 +2431,20 @@ void initialization_with_temp_destructor() {
y += x;
}
void param_with_destructor_by_value(ClassWithDestructor c) {
// The call to ~ClassWithDestructor::ClassWithDestructor() seems to be missing here.
}
void param_with_destructor_by_pointer(ClassWithDestructor* c) {
// No destructor call should be here
}
void param_with_destructor_by_ref(ClassWithDestructor& c) {
// No destructor call should be here
}
void param_with_destructor_by_rref(ClassWithDestructor&& c) {
// No destructor call should be here
}
// semmle-extractor-options: -std=c++20 --clang

View File

@@ -12968,6 +12968,37 @@
| ir.cpp:2431:14:2431:14 | Load | m2430_17 |
| ir.cpp:2431:14:2431:14 | Right | r2431_3 |
| ir.cpp:2431:14:2431:14 | Unary | r2431_2 |
| ir.cpp:2434:6:2434:35 | ChiPartial | partial:m2434_3 |
| ir.cpp:2434:6:2434:35 | ChiTotal | total:m2434_2 |
| ir.cpp:2434:6:2434:35 | SideEffect | m2434_3 |
| ir.cpp:2434:57:2434:57 | Address | &:r2434_5 |
| ir.cpp:2438:6:2438:37 | ChiPartial | partial:m2438_3 |
| ir.cpp:2438:6:2438:37 | ChiTotal | total:m2438_2 |
| ir.cpp:2438:6:2438:37 | SideEffect | m2438_3 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_5 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_5 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_7 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_7 |
| ir.cpp:2438:60:2438:60 | Load | m2438_6 |
| ir.cpp:2438:60:2438:60 | SideEffect | m2438_8 |
| ir.cpp:2442:6:2442:33 | ChiPartial | partial:m2442_3 |
| ir.cpp:2442:6:2442:33 | ChiTotal | total:m2442_2 |
| ir.cpp:2442:6:2442:33 | SideEffect | m2442_3 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_5 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_5 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_7 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_7 |
| ir.cpp:2442:56:2442:56 | Load | m2442_6 |
| ir.cpp:2442:56:2442:56 | SideEffect | m2442_8 |
| ir.cpp:2446:6:2446:34 | ChiPartial | partial:m2446_3 |
| ir.cpp:2446:6:2446:34 | ChiTotal | total:m2446_2 |
| ir.cpp:2446:6:2446:34 | SideEffect | m2446_3 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_5 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_5 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_7 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_7 |
| ir.cpp:2446:58:2446:58 | Load | m2446_6 |
| ir.cpp:2446:58:2446:58 | SideEffect | m2446_8 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |

View File

@@ -14362,6 +14362,63 @@ ir.cpp:
# 2410| v2410_5(void) = AliasedUse : ~m?
# 2410| v2410_6(void) = ExitFunction :
# 2434| void param_with_destructor_by_value(ClassWithDestructor)
# 2434| Block 0
# 2434| v2434_1(void) = EnterFunction :
# 2434| mu2434_2(unknown) = AliasedDefinition :
# 2434| mu2434_3(unknown) = InitializeNonLocal :
# 2434| r2434_4(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2434| mu2434_5(ClassWithDestructor) = InitializeParameter[c] : &:r2434_4
# 2436| v2436_1(void) = NoOp :
# 2434| v2434_6(void) = ReturnVoid :
# 2434| v2434_7(void) = AliasedUse : ~m?
# 2434| v2434_8(void) = ExitFunction :
# 2438| void param_with_destructor_by_pointer(ClassWithDestructor*)
# 2438| Block 0
# 2438| v2438_1(void) = EnterFunction :
# 2438| mu2438_2(unknown) = AliasedDefinition :
# 2438| mu2438_3(unknown) = InitializeNonLocal :
# 2438| r2438_4(glval<ClassWithDestructor *>) = VariableAddress[c] :
# 2438| mu2438_5(ClassWithDestructor *) = InitializeParameter[c] : &:r2438_4
# 2438| r2438_6(ClassWithDestructor *) = Load[c] : &:r2438_4, ~m?
# 2438| mu2438_7(unknown) = InitializeIndirection[c] : &:r2438_6
# 2440| v2440_1(void) = NoOp :
# 2438| v2438_8(void) = ReturnIndirection[c] : &:r2438_6, ~m?
# 2438| v2438_9(void) = ReturnVoid :
# 2438| v2438_10(void) = AliasedUse : ~m?
# 2438| v2438_11(void) = ExitFunction :
# 2442| void param_with_destructor_by_ref(ClassWithDestructor&)
# 2442| Block 0
# 2442| v2442_1(void) = EnterFunction :
# 2442| mu2442_2(unknown) = AliasedDefinition :
# 2442| mu2442_3(unknown) = InitializeNonLocal :
# 2442| r2442_4(glval<ClassWithDestructor &>) = VariableAddress[c] :
# 2442| mu2442_5(ClassWithDestructor &) = InitializeParameter[c] : &:r2442_4
# 2442| r2442_6(ClassWithDestructor &) = Load[c] : &:r2442_4, ~m?
# 2442| mu2442_7(unknown) = InitializeIndirection[c] : &:r2442_6
# 2444| v2444_1(void) = NoOp :
# 2442| v2442_8(void) = ReturnIndirection[c] : &:r2442_6, ~m?
# 2442| v2442_9(void) = ReturnVoid :
# 2442| v2442_10(void) = AliasedUse : ~m?
# 2442| v2442_11(void) = ExitFunction :
# 2446| void param_with_destructor_by_rref(ClassWithDestructor&&)
# 2446| Block 0
# 2446| v2446_1(void) = EnterFunction :
# 2446| mu2446_2(unknown) = AliasedDefinition :
# 2446| mu2446_3(unknown) = InitializeNonLocal :
# 2446| r2446_4(glval<ClassWithDestructor &&>) = VariableAddress[c] :
# 2446| mu2446_5(ClassWithDestructor &&) = InitializeParameter[c] : &:r2446_4
# 2446| r2446_6(ClassWithDestructor &&) = Load[c] : &:r2446_4, ~m?
# 2446| mu2446_7(unknown) = InitializeIndirection[c] : &:r2446_6
# 2448| v2448_1(void) = NoOp :
# 2446| v2446_8(void) = ReturnIndirection[c] : &:r2446_6, ~m?
# 2446| v2446_9(void) = ReturnVoid :
# 2446| v2446_10(void) = AliasedUse : ~m?
# 2446| v2446_11(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0