Skip to content

Commit a8b8eb4

Browse files
authored
Merge pull request github#17391 from MathiasVP/add-unexpected-loop-inconsistency
C++: Add testcase with IR inconsistencies
2 parents 78c6c09 + 25d7f17 commit a8b8eb4

9 files changed

+222
-0
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4474,6 +4474,33 @@ ir.c:
44744474
# 29| Type = [IntType] int
44754475
# 29| Value = [Literal] 0
44764476
# 29| ValueCategory = prvalue
4477+
# 32| [TopLevelFunction] void unexplained_loop_regression()
4478+
# 32| <params>:
4479+
# 33| getEntryPoint(): [BlockStmt] { ... }
4480+
# 34| getStmt(0): [MicrosoftTryExceptStmt] __try { ... } __except( ... ) { ... }
4481+
# 35| getStmt(): [BlockStmt] { ... }
4482+
# 36| getStmt(0): [ExprStmt] ExprStmt
4483+
# 36| getExpr(): [FunctionCall] call to ExRaiseAccessViolation
4484+
# 36| Type = [VoidType] void
4485+
# 36| ValueCategory = prvalue
4486+
# 36| getArgument(0): [Literal] 0
4487+
# 36| Type = [IntType] int
4488+
# 36| Value = [Literal] 0
4489+
# 36| ValueCategory = prvalue
4490+
# 38| getCondition(): [Literal] 1
4491+
# 38| Type = [IntType] int
4492+
# 38| Value = [Literal] 1
4493+
# 38| ValueCategory = prvalue
4494+
# 39| getExcept(): [BlockStmt] { ... }
4495+
# 40| getStmt(0): [ExprStmt] ExprStmt
4496+
# 40| getExpr(): [FunctionCall] call to ExRaiseAccessViolation
4497+
# 40| Type = [VoidType] void
4498+
# 40| ValueCategory = prvalue
4499+
# 40| getArgument(0): [Literal] 1
4500+
# 40| Type = [IntType] int
4501+
# 40| Value = [Literal] 1
4502+
# 40| ValueCategory = prvalue
4503+
# 42| getStmt(1): [ReturnStmt] return ...
44774504
ir.cpp:
44784505
# 1| [TopLevelFunction] void Constants()
44794506
# 1| <params>:

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3156,6 +3156,53 @@ ir.c:
31563156
# 21| Block 5
31573157
# 21| v21_11(void) = Unreached :
31583158

3159+
# 32| void unexplained_loop_regression()
3160+
# 32| Block 0
3161+
# 32| v32_1(void) = EnterFunction :
3162+
# 32| m32_2(unknown) = AliasedDefinition :
3163+
# 32| m32_3(unknown) = InitializeNonLocal :
3164+
# 32| m32_4(unknown) = Chi : total:m32_2, partial:m32_3
3165+
# 36| r36_1(glval<unknown>) = FunctionAddress[ExRaiseAccessViolation] :
3166+
# 36| r36_2(int) = Constant[0] :
3167+
# 36| v36_3(void) = Call[ExRaiseAccessViolation] : func:r36_1, 0:r36_2
3168+
# 36| m36_4(unknown) = ^CallSideEffect : ~m32_4
3169+
# 36| m36_5(unknown) = Chi : total:m32_4, partial:m36_4
3170+
#-----| Exception -> Block 3
3171+
3172+
# 39| Block 1
3173+
# 39| r39_1(int) = Constant[0] :
3174+
# 39| r39_2(bool) = CompareEQ : r38_2, r39_1
3175+
# 39| v39_3(void) = ConditionalBranch : r39_2
3176+
#-----| False (back edge) -> Block 2
3177+
#-----| True -> Block 5
3178+
3179+
# 39| Block 2
3180+
# 39| r39_4(int) = Constant[1] :
3181+
# 39| r39_5(bool) = CompareEQ : r38_2, r39_4
3182+
# 39| v39_6(void) = ConditionalBranch : r39_5
3183+
#-----| False -> Block 5
3184+
#-----| True (back edge) -> Block 4
3185+
3186+
# 38| Block 3
3187+
# 38| m38_1(unknown) = Phi : from 0:~m36_5, from 4:~m40_5
3188+
# 38| r38_2(int) = Constant[1] :
3189+
# 39| r39_7(int) = Constant[-1] :
3190+
# 39| r39_8(bool) = CompareEQ : r38_2, r39_7
3191+
# 39| v39_9(void) = ConditionalBranch : r39_8
3192+
#-----| False (back edge) -> Block 1
3193+
#-----| True -> Block 5
3194+
3195+
# 40| Block 4
3196+
# 40| r40_1(glval<unknown>) = FunctionAddress[ExRaiseAccessViolation] :
3197+
# 40| r40_2(int) = Constant[1] :
3198+
# 40| v40_3(void) = Call[ExRaiseAccessViolation] : func:r40_1, 0:r40_2
3199+
# 40| m40_4(unknown) = ^CallSideEffect : ~m38_1
3200+
# 40| m40_5(unknown) = Chi : total:m38_1, partial:m40_4
3201+
#-----| Exception (back edge) -> Block 3
3202+
3203+
# 32| Block 5
3204+
# 32| v32_5(void) = Unreached :
3205+
31593206
ir.cpp:
31603207
# 1| void Constants()
31613208
# 1| Block 0

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ sideEffectWithoutPrimary
88
instructionWithoutSuccessor
99
ambiguousSuccessors
1010
unexplainedLoop
11+
| ir.c:38:13:38:37 | Constant: 1 | Instruction 'Constant: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
12+
| ir.c:38:13:38:37 | Phi: 1 | Instruction 'Phi: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
13+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
14+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
15+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
16+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
17+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
18+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
19+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
20+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
21+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
22+
| ir.c:40:5:40:26 | Call: call to ExRaiseAccessViolation | Instruction 'Call: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
23+
| ir.c:40:5:40:26 | CallSideEffect: call to ExRaiseAccessViolation | Instruction 'CallSideEffect: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
24+
| ir.c:40:5:40:26 | Chi: call to ExRaiseAccessViolation | Instruction 'Chi: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
25+
| ir.c:40:5:40:26 | FunctionAddress: call to ExRaiseAccessViolation | Instruction 'FunctionAddress: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
26+
| ir.c:40:28:40:28 | Constant: 1 | Instruction 'Constant: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
1127
unnecessaryPhiInstruction
1228
memoryOperandDefinitionIsUnmodeled
1329
operandAcrossFunctions
@@ -18,6 +34,9 @@ containsLoopOfForwardEdges
1834
missingIRType
1935
multipleIRTypes
2036
lostReachability
37+
| ir.c:39:3:41:3 | Constant: { ... } | Block 'Constant: { ... }' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
38+
| ir.c:39:3:41:3 | Constant: { ... } | Block 'Constant: { ... }' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
39+
| ir.c:40:5:40:26 | FunctionAddress: call to ExRaiseAccessViolation | Block 'FunctionAddress: call to ExRaiseAccessViolation' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
2140
backEdgeCountMismatch
2241
useNotDominatedByDefinition
2342
switchInstructionWithoutDefaultEdge

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ sideEffectWithoutPrimary
88
instructionWithoutSuccessor
99
ambiguousSuccessors
1010
unexplainedLoop
11+
| ir.c:38:13:38:37 | Constant: 1 | Instruction 'Constant: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
12+
| ir.c:38:13:38:37 | Phi: 1 | Instruction 'Phi: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
13+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
14+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
15+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
16+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
17+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
18+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
19+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
20+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
21+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
22+
| ir.c:40:5:40:26 | Call: call to ExRaiseAccessViolation | Instruction 'Call: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
23+
| ir.c:40:5:40:26 | CallSideEffect: call to ExRaiseAccessViolation | Instruction 'CallSideEffect: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
24+
| ir.c:40:5:40:26 | Chi: call to ExRaiseAccessViolation | Instruction 'Chi: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
25+
| ir.c:40:5:40:26 | FunctionAddress: call to ExRaiseAccessViolation | Instruction 'FunctionAddress: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
26+
| ir.c:40:28:40:28 | Constant: 1 | Instruction 'Constant: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
1127
unnecessaryPhiInstruction
1228
memoryOperandDefinitionIsUnmodeled
1329
operandAcrossFunctions
@@ -18,6 +34,9 @@ containsLoopOfForwardEdges
1834
missingIRType
1935
multipleIRTypes
2036
lostReachability
37+
| ir.c:39:3:41:3 | Constant: { ... } | Block 'Constant: { ... }' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
38+
| ir.c:39:3:41:3 | Constant: { ... } | Block 'Constant: { ... }' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
39+
| ir.c:40:5:40:26 | FunctionAddress: call to ExRaiseAccessViolation | Block 'FunctionAddress: call to ExRaiseAccessViolation' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
2140
backEdgeCountMismatch
2241
useNotDominatedByDefinition
2342
switchInstructionWithoutDefaultEdge

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,16 @@ int TryExceptTest(int x) {
2929
return 0;
3030
}
3131

32+
void unexplained_loop_regression()
33+
{
34+
__try
35+
{
36+
ExRaiseAccessViolation(0);
37+
}
38+
__except (EXCEPTION_EXECUTE_HANDLER)
39+
{
40+
ExRaiseAccessViolation(1);
41+
}
42+
}
43+
3244
// semmle-extractor-options: --microsoft

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,20 @@ sideEffectWithoutPrimary
88
instructionWithoutSuccessor
99
ambiguousSuccessors
1010
unexplainedLoop
11+
| ir.c:38:13:38:37 | Constant: 1 | Instruction 'Constant: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
12+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
13+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
14+
| ir.c:39:3:41:3 | CompareEQ: { ... } | Instruction 'CompareEQ: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
15+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
16+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
17+
| ir.c:39:3:41:3 | ConditionalBranch: { ... } | Instruction 'ConditionalBranch: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
18+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
19+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
20+
| ir.c:39:3:41:3 | Constant: { ... } | Instruction 'Constant: { ... }' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
21+
| ir.c:40:5:40:26 | Call: call to ExRaiseAccessViolation | Instruction 'Call: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
22+
| ir.c:40:5:40:26 | CallSideEffect: call to ExRaiseAccessViolation | Instruction 'CallSideEffect: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
23+
| ir.c:40:5:40:26 | FunctionAddress: call to ExRaiseAccessViolation | Instruction 'FunctionAddress: call to ExRaiseAccessViolation' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
24+
| ir.c:40:28:40:28 | Constant: 1 | Instruction 'Constant: 1' is part of an unexplained loop in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
1125
unnecessaryPhiInstruction
1226
memoryOperandDefinitionIsUnmodeled
1327
operandAcrossFunctions
@@ -18,6 +32,10 @@ containsLoopOfForwardEdges
1832
missingIRType
1933
multipleIRTypes
2034
lostReachability
35+
| ir.c:39:3:41:3 | Constant: { ... } | Block 'Constant: { ... }' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
36+
| ir.c:39:3:41:3 | Constant: { ... } | Block 'Constant: { ... }' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
37+
| ir.c:39:3:41:3 | Unwind: { ... } | Block 'Unwind: { ... }' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
38+
| ir.c:40:5:40:26 | FunctionAddress: call to ExRaiseAccessViolation | Block 'FunctionAddress: call to ExRaiseAccessViolation' is not reachable by traversing only forward edges in function '$@'. | ir.c:32:6:32:32 | void unexplained_loop_regression() | void unexplained_loop_regression() |
2139
backEdgeCountMismatch
2240
useNotDominatedByDefinition
2341
| ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() |

0 commit comments

Comments
 (0)