Skip to content

Commit 2c8ed64

Browse files
committed
C++: test for return in if
1 parent 7e23ccd commit 2c8ed64

File tree

5 files changed

+176
-0
lines changed

5 files changed

+176
-0
lines changed

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17001,6 +17001,41 @@ ir.cpp:
1700117001
# 2234| Type = [Class] Bool
1700217002
# 2234| ValueCategory = lvalue
1700317003
# 2236| getStmt(2): [ReturnStmt] return ...
17004+
# 2238| [TopLevelFunction] void IfReturnDestructors(bool)
17005+
# 2238| <params>:
17006+
# 2238| getParameter(0): [Parameter] b
17007+
# 2238| Type = [BoolType] bool
17008+
# 2238| getEntryPoint(): [BlockStmt] { ... }
17009+
# 2239| getStmt(0): [DeclStmt] declaration
17010+
# 2239| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s
17011+
# 2239| Type = [Struct] String
17012+
# 2239| getVariable().getInitializer(): [Initializer] initializer for s
17013+
# 2239| getExpr(): [ConstructorCall] call to String
17014+
# 2239| Type = [VoidType] void
17015+
# 2239| ValueCategory = prvalue
17016+
# 2240| getStmt(1): [IfStmt] if (...) ...
17017+
# 2240| getCondition(): [VariableAccess] b
17018+
# 2240| Type = [BoolType] bool
17019+
# 2240| ValueCategory = prvalue(load)
17020+
# 2240| getThen(): [BlockStmt] { ... }
17021+
# 2241| getStmt(0): [ReturnStmt] return ...
17022+
# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String
17023+
# 2244| Type = [VoidType] void
17024+
# 2244| ValueCategory = prvalue
17025+
# 2244| getQualifier(): [VariableAccess] s
17026+
# 2244| Type = [Struct] String
17027+
# 2244| ValueCategory = lvalue
17028+
# 2243| getStmt(2): [ExprStmt] ExprStmt
17029+
# 2243| getExpr(): [VariableAccess] s
17030+
# 2243| Type = [Struct] String
17031+
# 2243| ValueCategory = lvalue
17032+
# 2244| getStmt(3): [ReturnStmt] return ...
17033+
# 2244| getImplicitDestructorCall(0): [DestructorCall] call to ~String
17034+
# 2244| Type = [VoidType] void
17035+
# 2244| ValueCategory = prvalue
17036+
# 2244| getQualifier(): [VariableAccess] s
17037+
# 2244| Type = [Struct] String
17038+
# 2244| ValueCategory = lvalue
1700417039
perf-regression.cpp:
1700517040
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
1700617041
# 4| <params>:

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

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13492,6 +13492,57 @@ ir.cpp:
1349213492
# 2223| v2223_8(void) = AliasedUse : ~m2234_13
1349313493
# 2223| v2223_9(void) = ExitFunction :
1349413494

13495+
# 2238| void IfReturnDestructors(bool)
13496+
# 2238| Block 0
13497+
# 2238| v2238_1(void) = EnterFunction :
13498+
# 2238| m2238_2(unknown) = AliasedDefinition :
13499+
# 2238| m2238_3(unknown) = InitializeNonLocal :
13500+
# 2238| m2238_4(unknown) = Chi : total:m2238_2, partial:m2238_3
13501+
# 2238| r2238_5(glval<bool>) = VariableAddress[b] :
13502+
# 2238| m2238_6(bool) = InitializeParameter[b] : &:r2238_5
13503+
# 2239| r2239_1(glval<String>) = VariableAddress[s] :
13504+
# 2239| m2239_2(String) = Uninitialized[s] : &:r2239_1
13505+
# 2239| r2239_3(glval<unknown>) = FunctionAddress[String] :
13506+
# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1
13507+
# 2239| m2239_5(unknown) = ^CallSideEffect : ~m2238_4
13508+
# 2239| m2239_6(unknown) = Chi : total:m2238_4, partial:m2239_5
13509+
# 2239| m2239_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1
13510+
# 2239| m2239_8(String) = Chi : total:m2239_2, partial:m2239_7
13511+
# 2240| r2240_1(glval<bool>) = VariableAddress[b] :
13512+
# 2240| r2240_2(bool) = Load[b] : &:r2240_1, m2238_6
13513+
# 2240| v2240_3(void) = ConditionalBranch : r2240_2
13514+
#-----| False -> Block 2
13515+
#-----| True -> Block 1
13516+
13517+
# 2241| Block 1
13518+
# 2241| v2241_1(void) = NoOp :
13519+
# 2244| r2244_1(glval<String>) = VariableAddress[s] :
13520+
# 2244| r2244_2(glval<unknown>) = FunctionAddress[~String] :
13521+
# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1
13522+
# 2244| m2244_4(unknown) = ^CallSideEffect : ~m2239_6
13523+
# 2244| m2244_5(unknown) = Chi : total:m2239_6, partial:m2244_4
13524+
# 2244| v2244_6(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, m2239_8
13525+
# 2244| m2244_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1
13526+
# 2244| m2244_8(String) = Chi : total:m2239_8, partial:m2244_7
13527+
#-----| Goto -> Block 2
13528+
13529+
# 2243| Block 2
13530+
# 2243| m2243_1(String) = Phi : from 0:m2239_8, from 1:m2244_8
13531+
# 2243| m2243_2(unknown) = Phi : from 0:~m2239_6, from 1:~m2244_5
13532+
# 2243| r2243_3(glval<String>) = VariableAddress[s] :
13533+
# 2244| v2244_9(void) = NoOp :
13534+
# 2244| r2244_10(glval<String>) = VariableAddress[s] :
13535+
# 2244| r2244_11(glval<unknown>) = FunctionAddress[~String] :
13536+
# 2244| v2244_12(void) = Call[~String] : func:r2244_11, this:r2244_10
13537+
# 2244| m2244_13(unknown) = ^CallSideEffect : ~m2243_2
13538+
# 2244| m2244_14(unknown) = Chi : total:m2243_2, partial:m2244_13
13539+
# 2244| v2244_15(void) = ^IndirectReadSideEffect[-1] : &:r2244_10, m2243_1
13540+
# 2244| m2244_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_10
13541+
# 2244| m2244_17(String) = Chi : total:m2243_1, partial:m2244_16
13542+
# 2238| v2238_7(void) = ReturnVoid :
13543+
# 2238| v2238_8(void) = AliasedUse : ~m2244_14
13544+
# 2238| v2238_9(void) = ExitFunction :
13545+
1349513546
perf-regression.cpp:
1349613547
# 6| void Big::Big()
1349713548
# 6| Block 0

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2235,4 +2235,12 @@ void WhileLoopDestructors(bool b) {
22352235
}
22362236
}
22372237

2238+
void IfReturnDestructors(bool b) {
2239+
String s;
2240+
if(b) {
2241+
return;
2242+
}
2243+
s;
2244+
}
2245+
22382246
// semmle-extractor-options: -std=c++20 --clang

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11042,6 +11042,46 @@
1104211042
| ir.cpp:2234:9:2234:9 | SideEffect | m2232_20 |
1104311043
| ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 |
1104411044
| ir.cpp:2234:9:2234:9 | SideEffect | ~m2232_17 |
11045+
| ir.cpp:2238:6:2238:24 | ChiPartial | partial:m2238_3 |
11046+
| ir.cpp:2238:6:2238:24 | ChiTotal | total:m2238_2 |
11047+
| ir.cpp:2238:6:2238:24 | SideEffect | ~m2244_14 |
11048+
| ir.cpp:2238:31:2238:31 | Address | &:r2238_5 |
11049+
| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 |
11050+
| ir.cpp:2239:12:2239:12 | Address | &:r2239_1 |
11051+
| ir.cpp:2239:12:2239:12 | Arg(this) | this:r2239_1 |
11052+
| ir.cpp:2239:12:2239:12 | CallTarget | func:r2239_3 |
11053+
| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_5 |
11054+
| ir.cpp:2239:12:2239:12 | ChiPartial | partial:m2239_7 |
11055+
| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2238_4 |
11056+
| ir.cpp:2239:12:2239:12 | ChiTotal | total:m2239_2 |
11057+
| ir.cpp:2239:12:2239:12 | SideEffect | ~m2238_4 |
11058+
| ir.cpp:2240:8:2240:8 | Address | &:r2240_1 |
11059+
| ir.cpp:2240:8:2240:8 | Condition | r2240_2 |
11060+
| ir.cpp:2240:8:2240:8 | Load | m2238_6 |
11061+
| ir.cpp:2243:5:2243:5 | Phi | from 0:m2239_8 |
11062+
| ir.cpp:2243:5:2243:5 | Phi | from 0:~m2239_6 |
11063+
| ir.cpp:2243:5:2243:5 | Phi | from 1:m2244_8 |
11064+
| ir.cpp:2243:5:2243:5 | Phi | from 1:~m2244_5 |
11065+
| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 |
11066+
| ir.cpp:2244:1:2244:1 | Address | &:r2244_1 |
11067+
| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 |
11068+
| ir.cpp:2244:1:2244:1 | Address | &:r2244_10 |
11069+
| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_1 |
11070+
| ir.cpp:2244:1:2244:1 | Arg(this) | this:r2244_10 |
11071+
| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_2 |
11072+
| ir.cpp:2244:1:2244:1 | CallTarget | func:r2244_11 |
11073+
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_4 |
11074+
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_7 |
11075+
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_13 |
11076+
| ir.cpp:2244:1:2244:1 | ChiPartial | partial:m2244_16 |
11077+
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_6 |
11078+
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2239_8 |
11079+
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_1 |
11080+
| ir.cpp:2244:1:2244:1 | ChiTotal | total:m2243_2 |
11081+
| ir.cpp:2244:1:2244:1 | SideEffect | m2239_8 |
11082+
| ir.cpp:2244:1:2244:1 | SideEffect | m2243_1 |
11083+
| ir.cpp:2244:1:2244:1 | SideEffect | ~m2239_6 |
11084+
| ir.cpp:2244:1:2244:1 | SideEffect | ~m2243_2 |
1104511085
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
1104611086
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
1104711087
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12685,6 +12685,48 @@ ir.cpp:
1268512685
# 2223| v2223_7(void) = AliasedUse : ~m?
1268612686
# 2223| v2223_8(void) = ExitFunction :
1268712687

12688+
# 2238| void IfReturnDestructors(bool)
12689+
# 2238| Block 0
12690+
# 2238| v2238_1(void) = EnterFunction :
12691+
# 2238| mu2238_2(unknown) = AliasedDefinition :
12692+
# 2238| mu2238_3(unknown) = InitializeNonLocal :
12693+
# 2238| r2238_4(glval<bool>) = VariableAddress[b] :
12694+
# 2238| mu2238_5(bool) = InitializeParameter[b] : &:r2238_4
12695+
# 2239| r2239_1(glval<String>) = VariableAddress[s] :
12696+
# 2239| mu2239_2(String) = Uninitialized[s] : &:r2239_1
12697+
# 2239| r2239_3(glval<unknown>) = FunctionAddress[String] :
12698+
# 2239| v2239_4(void) = Call[String] : func:r2239_3, this:r2239_1
12699+
# 2239| mu2239_5(unknown) = ^CallSideEffect : ~m?
12700+
# 2239| mu2239_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2239_1
12701+
# 2240| r2240_1(glval<bool>) = VariableAddress[b] :
12702+
# 2240| r2240_2(bool) = Load[b] : &:r2240_1, ~m?
12703+
# 2240| v2240_3(void) = ConditionalBranch : r2240_2
12704+
#-----| False -> Block 2
12705+
#-----| True -> Block 1
12706+
12707+
# 2241| Block 1
12708+
# 2241| v2241_1(void) = NoOp :
12709+
# 2244| r2244_1(glval<String>) = VariableAddress[s] :
12710+
# 2244| r2244_2(glval<unknown>) = FunctionAddress[~String] :
12711+
# 2244| v2244_3(void) = Call[~String] : func:r2244_2, this:r2244_1
12712+
# 2244| mu2244_4(unknown) = ^CallSideEffect : ~m?
12713+
# 2244| v2244_5(void) = ^IndirectReadSideEffect[-1] : &:r2244_1, ~m?
12714+
# 2244| mu2244_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_1
12715+
#-----| Goto -> Block 2
12716+
12717+
# 2243| Block 2
12718+
# 2243| r2243_1(glval<String>) = VariableAddress[s] :
12719+
# 2244| v2244_7(void) = NoOp :
12720+
# 2244| r2244_8(glval<String>) = VariableAddress[s] :
12721+
# 2244| r2244_9(glval<unknown>) = FunctionAddress[~String] :
12722+
# 2244| v2244_10(void) = Call[~String] : func:r2244_9, this:r2244_8
12723+
# 2244| mu2244_11(unknown) = ^CallSideEffect : ~m?
12724+
# 2244| v2244_12(void) = ^IndirectReadSideEffect[-1] : &:r2244_8, ~m?
12725+
# 2244| mu2244_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r2244_8
12726+
# 2238| v2238_6(void) = ReturnVoid :
12727+
# 2238| v2238_7(void) = AliasedUse : ~m?
12728+
# 2238| v2238_8(void) = ExitFunction :
12729+
1268812730
perf-regression.cpp:
1268912731
# 6| void Big::Big()
1269012732
# 6| Block 0

0 commit comments

Comments
 (0)