C++: test for return in if

This commit is contained in:
Robert Marsh
2024-02-16 17:55:34 +00:00
parent 7e23ccd383
commit 2c8ed6479a
5 changed files with 176 additions and 0 deletions

View File

@@ -17001,6 +17001,41 @@ ir.cpp:
# 2234| Type = [Class] Bool
# 2234| ValueCategory = lvalue
# 2236| getStmt(2): [ReturnStmt] return ...
# 2238| [TopLevelFunction] void IfReturnDestructors(bool)
# 2238| <params>:
# 2238| getParameter(0): [Parameter] b
# 2238| Type = [BoolType] bool
# 2238| getEntryPoint(): [BlockStmt] { ... }
# 2239| getStmt(0): [DeclStmt] declaration
# 2239| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
# 2239| Type = [Struct] String
# 2239| getVariable().getInitializer(): [Initializer] initializer for s
# 2239| getExpr(): [ConstructorCall] call to String
# 2239| Type = [VoidType] void
# 2239| ValueCategory = prvalue
# 2240| getStmt(1): [IfStmt] if (...) ...
# 2240| getCondition(): [VariableAccess] b
# 2240| Type = [BoolType] bool
# 2240| ValueCategory = prvalue(load)
# 2240| getThen(): [BlockStmt] { ... }
# 2241| getStmt(0): [ReturnStmt] return ...
# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String
# 2244| Type = [VoidType] void
# 2244| ValueCategory = prvalue
# 2244| getQualifier(): [VariableAccess] s
# 2244| Type = [Struct] String
# 2244| ValueCategory = lvalue
# 2243| getStmt(2): [ExprStmt] ExprStmt
# 2243| getExpr(): [VariableAccess] s
# 2243| Type = [Struct] String
# 2243| ValueCategory = lvalue
# 2244| getStmt(3): [ReturnStmt] return ...
# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String
# 2244| Type = [VoidType] void
# 2244| ValueCategory = prvalue
# 2244| getQualifier(): [VariableAccess] s
# 2244| Type = [Struct] String
# 2244| ValueCategory = lvalue
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -13492,6 +13492,57 @@ ir.cpp:
# 2223| v2223_8(void) = AliasedUse : ~m2234_13
# 2223| v2223_9(void) = ExitFunction :
# 2238| void IfReturnDestructors(bool)
# 2238| Block 0
# 2238| v2238_1(void) = EnterFunction :
# 2238| m2238_2(unknown) = AliasedDefinition :
# 2238| m2238_3(unknown) = InitializeNonLocal :
# 2238| m2238_4(unknown) = Chi : total:m2238_2, partial:m2238_3
# 2238| r2238_5(glval<bool>) = VariableAddress[b] :
# 2238| m2238_6(bool) = InitializeParameter[b] : &:r2238_5
# 2239| r2239_1(glval<String>) = VariableAddress[s] :
# 2239| m2239_2(String) = Uninitialized[s] : &:r2239_1
# 2239| r2239_3(glval<unknown>) = FunctionAddress[String] :
# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1
# 2239| m2239_5(unknown) = ^CallSideEffect : ~m2238_4
# 2239| m2239_6(unknown) = Chi : total:m2238_4, partial:m2239_5
# 2239| m2239_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1
# 2239| m2239_8(String) = Chi : total:m2239_2, partial:m2239_7
# 2240| r2240_1(glval<bool>) = VariableAddress[b] :
# 2240| r2240_2(bool) = Load[b] : &:r2240_1, m2238_6
# 2240| v2240_3(void) = ConditionalBranch : r2240_2
#-----| False -> Block 2
#-----| True -> Block 1
# 2241| Block 1
# 2241| v2241_1(void) = NoOp :
# 2244| r2244_1(glval<String>) = VariableAddress[s] :
# 2244| r2244_2(glval<unknown>) = FunctionAddress[~String] :
# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1
# 2244| m2244_4(unknown) = ^CallSideEffect : ~m2239_6
# 2244| m2244_5(unknown) = Chi : total:m2239_6, partial:m2244_4
# 2244| v2244_6(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, m2239_8
# 2244| m2244_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1
# 2244| m2244_8(String) = Chi : total:m2239_8, partial:m2244_7
#-----| Goto -> Block 2
# 2243| Block 2
# 2243| m2243_1(String) = Phi : from 0:m2239_8, from 1:m2244_8
# 2243| m2243_2(unknown) = Phi : from 0:~m2239_6, from 1:~m2244_5
# 2243| r2243_3(glval<String>) = VariableAddress[s] :
# 2244| v2244_9(void) = NoOp :
# 2244| r2244_10(glval<String>) = VariableAddress[s] :
# 2244| r2244_11(glval<unknown>) = FunctionAddress[~String] :
# 2244| v2244_12(void) = Call[~String] : func:r2244_11, this:r2244_10
# 2244| m2244_13(unknown) = ^CallSideEffect : ~m2243_2
# 2244| m2244_14(unknown) = Chi : total:m2243_2, partial:m2244_13
# 2244| v2244_15(void) = ^IndirectReadSideEffect[-1] : &:r2244_10, m2243_1
# 2244| m2244_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_10
# 2244| m2244_17(String) = Chi : total:m2243_1, partial:m2244_16
# 2238| v2238_7(void) = ReturnVoid :
# 2238| v2238_8(void) = AliasedUse : ~m2244_14
# 2238| v2238_9(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -2235,4 +2235,12 @@ void WhileLoopDestructors(bool b) {
}
}
void IfReturnDestructors(bool b) {
String s;
if(b) {
return;
}
s;
}
// semmle-extractor-options: -std=c++20 --clang

View File

@@ -11042,6 +11042,46 @@
| ir.cpp:2234:9:2234:9 | SideEffect | m2232_20 |
| ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 |
| ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 |
| ir.cpp:2238:6:2238:24 | ChiPartial | partial:m2238_3 |
| ir.cpp:2238:6:2238:24 | ChiTotal | total:m2238_2 |
| ir.cpp:2238:6:2238:24 | SideEffect | ~m2244_14 |
| ir.cpp:2238:31:2238:31 | Address | &:r2238_5 |
| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 |
| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 |
| ir.cpp:2239:12:2239:12 | Arg(this) | this:r2239_1 |
| ir.cpp:2239:12:2239:12 | CallTarget | func:r2239_3 |
| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_5 |
| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_7 |
| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2238_4 |
| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2239_2 |
| ir.cpp:2239:12:2239:12 | SideEffect | ~m2238_4 |
| ir.cpp:2240:8:2240:8 | Address | &:r2240_1 |
| ir.cpp:2240:8:2240:8 | Condition | r2240_2 |
| ir.cpp:2240:8:2240:8 | Load | m2238_6 |
| ir.cpp:2243:5:2243:5 | Phi | from 0:m2239_8 |
| ir.cpp:2243:5:2243:5 | Phi | from 0:~m2239_6 |
| ir.cpp:2243:5:2243:5 | Phi | from 1:m2244_8 |
| ir.cpp:2243:5:2243:5 | Phi | from 1:~m2244_5 |
| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 |
| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 |
| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 |
| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 |
| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_1 |
| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_10 |
| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_2 |
| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_11 |
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_4 |
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_7 |
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_13 |
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_16 |
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_6 |
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_8 |
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_1 |
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_2 |
| ir.cpp:2244:1:2244:1 | SideEffect | m2239_8 |
| ir.cpp:2244:1:2244:1 | SideEffect | m2243_1 |
| ir.cpp:2244:1:2244:1 | SideEffect | ~m2239_6 |
| ir.cpp:2244:1:2244:1 | SideEffect | ~m2243_2 |
| 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

@@ -12685,6 +12685,48 @@ ir.cpp:
# 2223| v2223_7(void) = AliasedUse : ~m?
# 2223| v2223_8(void) = ExitFunction :
# 2238| void IfReturnDestructors(bool)
# 2238| Block 0
# 2238| v2238_1(void) = EnterFunction :
# 2238| mu2238_2(unknown) = AliasedDefinition :
# 2238| mu2238_3(unknown) = InitializeNonLocal :
# 2238| r2238_4(glval<bool>) = VariableAddress[b] :
# 2238| mu2238_5(bool) = InitializeParameter[b] : &:r2238_4
# 2239| r2239_1(glval<String>) = VariableAddress[s] :
# 2239| mu2239_2(String) = Uninitialized[s] : &:r2239_1
# 2239| r2239_3(glval<unknown>) = FunctionAddress[String] :
# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1
# 2239| mu2239_5(unknown) = ^CallSideEffect : ~m?
# 2239| mu2239_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1
# 2240| r2240_1(glval<bool>) = VariableAddress[b] :
# 2240| r2240_2(bool) = Load[b] : &:r2240_1, ~m?
# 2240| v2240_3(void) = ConditionalBranch : r2240_2
#-----| False -> Block 2
#-----| True -> Block 1
# 2241| Block 1
# 2241| v2241_1(void) = NoOp :
# 2244| r2244_1(glval<String>) = VariableAddress[s] :
# 2244| r2244_2(glval<unknown>) = FunctionAddress[~String] :
# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1
# 2244| mu2244_4(unknown) = ^CallSideEffect : ~m?
# 2244| v2244_5(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, ~m?
# 2244| mu2244_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1
#-----| Goto -> Block 2
# 2243| Block 2
# 2243| r2243_1(glval<String>) = VariableAddress[s] :
# 2244| v2244_7(void) = NoOp :
# 2244| r2244_8(glval<String>) = VariableAddress[s] :
# 2244| r2244_9(glval<unknown>) = FunctionAddress[~String] :
# 2244| v2244_10(void) = Call[~String] : func:r2244_9, this:r2244_8
# 2244| mu2244_11(unknown) = ^CallSideEffect : ~m?
# 2244| v2244_12(void) = ^IndirectReadSideEffect[-1] : &:r2244_8, ~m?
# 2244| mu2244_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_8
# 2238| v2238_6(void) = ReturnVoid :
# 2238| v2238_7(void) = AliasedUse : ~m?
# 2238| v2238_8(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0