Skip to content

Commit 14445a3

Browse files
authored
Merge pull request #19380 from hvitved/csharp/cfg/switch-fall-through
C#: Fix CFG for fall-through switch statements
2 parents 987af4c + e79a906 commit 14445a3

File tree

11 files changed

+236
-3
lines changed

11 files changed

+236
-3
lines changed

csharp/ql/lib/semmle/code/csharp/Stmt.qll

+7-2
Original file line numberDiff line numberDiff line change
@@ -278,9 +278,14 @@ class CaseStmt extends Case, @case_stmt {
278278
override PatternExpr getPattern() { result = this.getChild(0) }
279279

280280
override Stmt getBody() {
281-
exists(int i |
281+
exists(int i, Stmt next |
282282
this = this.getParent().getChild(i) and
283-
result = this.getParent().getChild(i + 1)
283+
next = this.getParent().getChild(i + 1)
284+
|
285+
result = next and
286+
not result instanceof CaseStmt
287+
or
288+
result = next.(CaseStmt).getBody()
284289
)
285290
}
286291

csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll

+7-1
Original file line numberDiff line numberDiff line change
@@ -1153,7 +1153,13 @@ module Statements {
11531153
)
11541154
or
11551155
// Flow from last element of `case` statement `i` to first element of statement `i+1`
1156-
exists(int i | last(super.getStmt(i).(CaseStmt).getBody(), pred, c) |
1156+
exists(int i, Stmt body |
1157+
body = super.getStmt(i).(CaseStmt).getBody() and
1158+
// in case of fall-through cases, make sure to not jump from their shared body back
1159+
// to one of the fall-through cases
1160+
not body = super.getStmt(i + 1).(CaseStmt).getBody() and
1161+
last(body, pred, c)
1162+
|
11571163
c instanceof NormalCompletion and
11581164
first(super.getStmt(i + 1), succ)
11591165
)

csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected

+7
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,13 @@
10781078
| Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:52 | ... => ... | 2 |
10791079
| Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:48 | call to method WriteLine | 6 |
10801080
| Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:48 | call to method WriteLine | 6 |
1081+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:167:18:167:18 | 1 | 6 |
1082+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:163:10:163:12 | exit M16 | 2 |
1083+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:18:168:18 | 2 | 2 |
1084+
| Switch.cs:169:17:169:51 | ...; | Switch.cs:170:17:170:22 | break; | 4 |
1085+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:18:171:18 | 3 | 2 |
1086+
| Switch.cs:172:17:172:46 | ...; | Switch.cs:173:17:173:22 | break; | 4 |
1087+
| Switch.cs:174:13:174:20 | default: | Switch.cs:176:17:176:22 | break; | 5 |
10811088
| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | 5 |
10821089
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:18:7:22 | Int32 j | 13 |
10831090
| TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | 1 |

csharp/ql/test/library-tests/controlflow/graph/Condition.expected

+9
Original file line numberDiff line numberDiff line change
@@ -2140,6 +2140,15 @@ conditionBlock
21402140
| Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:158:13:158:49 | ...; | true |
21412141
| Switch.cs:156:17:156:54 | ... switch { ... } | Switch.cs:160:13:160:49 | ...; | false |
21422142
| Switch.cs:156:41:156:45 | false | Switch.cs:156:50:156:52 | "b" | true |
2143+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:168:13:168:19 | case ...: | false |
2144+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:171:13:171:19 | case ...: | false |
2145+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:172:17:172:46 | ...; | false |
2146+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:174:13:174:20 | default: | false |
2147+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:171:13:171:19 | case ...: | false |
2148+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:172:17:172:46 | ...; | false |
2149+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:174:13:174:20 | default: | false |
2150+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:172:17:172:46 | ...; | true |
2151+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:174:13:174:20 | default: | false |
21432152
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | [false] ... is ... | false |
21442153
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | [true] ... is ... | true |
21452154
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:25:7:25 | ; | true |

csharp/ql/test/library-tests/controlflow/graph/Dominance.expected

+75
Original file line numberDiff line numberDiff line change
@@ -3678,6 +3678,29 @@ dominance
36783678
| Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:45:160:45 | access to local variable s |
36793679
| Switch.cs:160:44:160:46 | {...} | Switch.cs:160:38:160:47 | $"..." |
36803680
| Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:44:160:46 | {...} |
3681+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:164:5:178:5 | {...} |
3682+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:163:10:163:12 | exit M16 |
3683+
| Switch.cs:164:5:178:5 | {...} | Switch.cs:165:9:177:9 | switch (...) {...} |
3684+
| Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:165:17:165:17 | access to parameter i |
3685+
| Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:167:13:167:19 | case ...: |
3686+
| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:18:167:18 | 1 |
3687+
| Switch.cs:167:18:167:18 | 1 | Switch.cs:168:13:168:19 | case ...: |
3688+
| Switch.cs:167:18:167:18 | 1 | Switch.cs:169:17:169:51 | ...; |
3689+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:18:168:18 | 2 |
3690+
| Switch.cs:168:18:168:18 | 2 | Switch.cs:171:13:171:19 | case ...: |
3691+
| Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:170:17:170:22 | break; |
3692+
| Switch.cs:169:17:169:51 | ...; | Switch.cs:169:42:169:49 | "1 or 2" |
3693+
| Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:169:17:169:50 | call to method WriteLine |
3694+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:18:171:18 | 3 |
3695+
| Switch.cs:171:18:171:18 | 3 | Switch.cs:172:17:172:46 | ...; |
3696+
| Switch.cs:171:18:171:18 | 3 | Switch.cs:174:13:174:20 | default: |
3697+
| Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:173:17:173:22 | break; |
3698+
| Switch.cs:172:17:172:46 | ...; | Switch.cs:172:42:172:44 | "3" |
3699+
| Switch.cs:172:42:172:44 | "3" | Switch.cs:172:17:172:45 | call to method WriteLine |
3700+
| Switch.cs:174:13:174:20 | default: | Switch.cs:175:17:175:48 | ...; |
3701+
| Switch.cs:175:17:175:47 | call to method WriteLine | Switch.cs:176:17:176:22 | break; |
3702+
| Switch.cs:175:17:175:48 | ...; | Switch.cs:175:42:175:46 | "def" |
3703+
| Switch.cs:175:42:175:46 | "def" | Switch.cs:175:17:175:47 | call to method WriteLine |
36813704
| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | {...} |
36823705
| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | call to constructor Object |
36833706
| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses |
@@ -7854,6 +7877,27 @@ postDominance
78547877
| Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:13:160:49 | ...; |
78557878
| Switch.cs:160:44:160:46 | {...} | Switch.cs:160:45:160:45 | access to local variable s |
78567879
| Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:40:160:43 | "b = " |
7880+
| Switch.cs:163:10:163:12 | exit M16 | Switch.cs:163:10:163:12 | exit M16 (normal) |
7881+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:170:17:170:22 | break; |
7882+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:173:17:173:22 | break; |
7883+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:176:17:176:22 | break; |
7884+
| Switch.cs:164:5:178:5 | {...} | Switch.cs:163:10:163:12 | enter M16 |
7885+
| Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:164:5:178:5 | {...} |
7886+
| Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:165:9:177:9 | switch (...) {...} |
7887+
| Switch.cs:167:13:167:19 | case ...: | Switch.cs:165:17:165:17 | access to parameter i |
7888+
| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:13:167:19 | case ...: |
7889+
| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:13:168:19 | case ...: |
7890+
| Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:169:42:169:49 | "1 or 2" |
7891+
| Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:169:17:169:51 | ...; |
7892+
| Switch.cs:170:17:170:22 | break; | Switch.cs:169:17:169:50 | call to method WriteLine |
7893+
| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:13:171:19 | case ...: |
7894+
| Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:172:42:172:44 | "3" |
7895+
| Switch.cs:172:42:172:44 | "3" | Switch.cs:172:17:172:46 | ...; |
7896+
| Switch.cs:173:17:173:22 | break; | Switch.cs:172:17:172:45 | call to method WriteLine |
7897+
| Switch.cs:175:17:175:47 | call to method WriteLine | Switch.cs:175:42:175:46 | "def" |
7898+
| Switch.cs:175:17:175:48 | ...; | Switch.cs:174:13:174:20 | default: |
7899+
| Switch.cs:175:42:175:46 | "def" | Switch.cs:175:17:175:48 | ...; |
7900+
| Switch.cs:176:17:176:22 | break; | Switch.cs:175:17:175:47 | call to method WriteLine |
78577901
| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses |
78587902
| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) |
78597903
| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses (normal) | TypeAccesses.cs:1:7:1:18 | {...} |
@@ -12467,6 +12511,24 @@ blockDominance
1246712511
| Switch.cs:156:50:156:52 | "b" | Switch.cs:156:50:156:52 | "b" |
1246812512
| Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:49 | ...; |
1246912513
| Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:49 | ...; |
12514+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:163:10:163:12 | enter M16 |
12515+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:163:10:163:12 | exit M16 (normal) |
12516+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:168:13:168:19 | case ...: |
12517+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:169:17:169:51 | ...; |
12518+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:171:13:171:19 | case ...: |
12519+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:172:17:172:46 | ...; |
12520+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:174:13:174:20 | default: |
12521+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:163:10:163:12 | exit M16 (normal) |
12522+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:13:168:19 | case ...: |
12523+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:171:13:171:19 | case ...: |
12524+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:172:17:172:46 | ...; |
12525+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:174:13:174:20 | default: |
12526+
| Switch.cs:169:17:169:51 | ...; | Switch.cs:169:17:169:51 | ...; |
12527+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:13:171:19 | case ...: |
12528+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:172:17:172:46 | ...; |
12529+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:174:13:174:20 | default: |
12530+
| Switch.cs:172:17:172:46 | ...; | Switch.cs:172:17:172:46 | ...; |
12531+
| Switch.cs:174:13:174:20 | default: | Switch.cs:174:13:174:20 | default: |
1247012532
| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses |
1247112533
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M |
1247212534
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | [false] ... is ... |
@@ -15794,6 +15856,19 @@ postBlockDominance
1579415856
| Switch.cs:156:50:156:52 | "b" | Switch.cs:156:50:156:52 | "b" |
1579515857
| Switch.cs:158:13:158:49 | ...; | Switch.cs:158:13:158:49 | ...; |
1579615858
| Switch.cs:160:13:160:49 | ...; | Switch.cs:160:13:160:49 | ...; |
15859+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:163:10:163:12 | enter M16 |
15860+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:163:10:163:12 | enter M16 |
15861+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:163:10:163:12 | exit M16 (normal) |
15862+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:168:13:168:19 | case ...: |
15863+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:169:17:169:51 | ...; |
15864+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:171:13:171:19 | case ...: |
15865+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:172:17:172:46 | ...; |
15866+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:174:13:174:20 | default: |
15867+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:13:168:19 | case ...: |
15868+
| Switch.cs:169:17:169:51 | ...; | Switch.cs:169:17:169:51 | ...; |
15869+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:13:171:19 | case ...: |
15870+
| Switch.cs:172:17:172:46 | ...; | Switch.cs:172:17:172:46 | ...; |
15871+
| Switch.cs:174:13:174:20 | default: | Switch.cs:174:13:174:20 | default: |
1579715872
| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | enter TypeAccesses |
1579815873
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M |
1579915874
| TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:7:13:7:22 | [false] ... is ... |

csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected

+32
Original file line numberDiff line numberDiff line change
@@ -4029,6 +4029,31 @@ nodeEnclosing
40294029
| Switch.cs:160:40:160:43 | "b = " | Switch.cs:154:10:154:12 | M15 |
40304030
| Switch.cs:160:44:160:46 | {...} | Switch.cs:154:10:154:12 | M15 |
40314031
| Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:154:10:154:12 | M15 |
4032+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:163:10:163:12 | M16 |
4033+
| Switch.cs:163:10:163:12 | exit M16 | Switch.cs:163:10:163:12 | M16 |
4034+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:163:10:163:12 | M16 |
4035+
| Switch.cs:164:5:178:5 | {...} | Switch.cs:163:10:163:12 | M16 |
4036+
| Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:163:10:163:12 | M16 |
4037+
| Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:163:10:163:12 | M16 |
4038+
| Switch.cs:167:13:167:19 | case ...: | Switch.cs:163:10:163:12 | M16 |
4039+
| Switch.cs:167:18:167:18 | 1 | Switch.cs:163:10:163:12 | M16 |
4040+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:163:10:163:12 | M16 |
4041+
| Switch.cs:168:18:168:18 | 2 | Switch.cs:163:10:163:12 | M16 |
4042+
| Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:163:10:163:12 | M16 |
4043+
| Switch.cs:169:17:169:51 | ...; | Switch.cs:163:10:163:12 | M16 |
4044+
| Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:163:10:163:12 | M16 |
4045+
| Switch.cs:170:17:170:22 | break; | Switch.cs:163:10:163:12 | M16 |
4046+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:163:10:163:12 | M16 |
4047+
| Switch.cs:171:18:171:18 | 3 | Switch.cs:163:10:163:12 | M16 |
4048+
| Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:163:10:163:12 | M16 |
4049+
| Switch.cs:172:17:172:46 | ...; | Switch.cs:163:10:163:12 | M16 |
4050+
| Switch.cs:172:42:172:44 | "3" | Switch.cs:163:10:163:12 | M16 |
4051+
| Switch.cs:173:17:173:22 | break; | Switch.cs:163:10:163:12 | M16 |
4052+
| Switch.cs:174:13:174:20 | default: | Switch.cs:163:10:163:12 | M16 |
4053+
| Switch.cs:175:17:175:47 | call to method WriteLine | Switch.cs:163:10:163:12 | M16 |
4054+
| Switch.cs:175:17:175:48 | ...; | Switch.cs:163:10:163:12 | M16 |
4055+
| Switch.cs:175:42:175:46 | "def" | Switch.cs:163:10:163:12 | M16 |
4056+
| Switch.cs:176:17:176:22 | break; | Switch.cs:163:10:163:12 | M16 |
40324057
| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | TypeAccesses |
40334058
| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses |
40344059
| TypeAccesses.cs:1:7:1:18 | exit TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses |
@@ -5913,6 +5938,13 @@ blockEnclosing
59135938
| Switch.cs:156:50:156:52 | "b" | Switch.cs:154:10:154:12 | M15 |
59145939
| Switch.cs:158:13:158:49 | ...; | Switch.cs:154:10:154:12 | M15 |
59155940
| Switch.cs:160:13:160:49 | ...; | Switch.cs:154:10:154:12 | M15 |
5941+
| Switch.cs:163:10:163:12 | enter M16 | Switch.cs:163:10:163:12 | M16 |
5942+
| Switch.cs:163:10:163:12 | exit M16 (normal) | Switch.cs:163:10:163:12 | M16 |
5943+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:163:10:163:12 | M16 |
5944+
| Switch.cs:169:17:169:51 | ...; | Switch.cs:163:10:163:12 | M16 |
5945+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:163:10:163:12 | M16 |
5946+
| Switch.cs:172:17:172:46 | ...; | Switch.cs:163:10:163:12 | M16 |
5947+
| Switch.cs:174:13:174:20 | default: | Switch.cs:163:10:163:12 | M16 |
59165948
| TypeAccesses.cs:1:7:1:18 | enter TypeAccesses | TypeAccesses.cs:1:7:1:18 | TypeAccesses |
59175949
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | M |
59185950
| TypeAccesses.cs:7:13:7:22 | [false] ... is ... | TypeAccesses.cs:3:10:3:10 | M |

csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected

+22
Original file line numberDiff line numberDiff line change
@@ -2711,6 +2711,28 @@
27112711
| Switch.cs:160:40:160:43 | "b = " | Switch.cs:160:40:160:43 | "b = " |
27122712
| Switch.cs:160:44:160:46 | {...} | Switch.cs:160:45:160:45 | access to local variable s |
27132713
| Switch.cs:160:45:160:45 | access to local variable s | Switch.cs:160:45:160:45 | access to local variable s |
2714+
| Switch.cs:164:5:178:5 | {...} | Switch.cs:164:5:178:5 | {...} |
2715+
| Switch.cs:165:9:177:9 | switch (...) {...} | Switch.cs:165:9:177:9 | switch (...) {...} |
2716+
| Switch.cs:165:17:165:17 | access to parameter i | Switch.cs:165:17:165:17 | access to parameter i |
2717+
| Switch.cs:167:13:167:19 | case ...: | Switch.cs:167:13:167:19 | case ...: |
2718+
| Switch.cs:167:18:167:18 | 1 | Switch.cs:167:18:167:18 | 1 |
2719+
| Switch.cs:168:13:168:19 | case ...: | Switch.cs:168:13:168:19 | case ...: |
2720+
| Switch.cs:168:18:168:18 | 2 | Switch.cs:168:18:168:18 | 2 |
2721+
| Switch.cs:169:17:169:50 | call to method WriteLine | Switch.cs:169:42:169:49 | "1 or 2" |
2722+
| Switch.cs:169:17:169:51 | ...; | Switch.cs:169:17:169:51 | ...; |
2723+
| Switch.cs:169:42:169:49 | "1 or 2" | Switch.cs:169:42:169:49 | "1 or 2" |
2724+
| Switch.cs:170:17:170:22 | break; | Switch.cs:170:17:170:22 | break; |
2725+
| Switch.cs:171:13:171:19 | case ...: | Switch.cs:171:13:171:19 | case ...: |
2726+
| Switch.cs:171:18:171:18 | 3 | Switch.cs:171:18:171:18 | 3 |
2727+
| Switch.cs:172:17:172:45 | call to method WriteLine | Switch.cs:172:42:172:44 | "3" |
2728+
| Switch.cs:172:17:172:46 | ...; | Switch.cs:172:17:172:46 | ...; |
2729+
| Switch.cs:172:42:172:44 | "3" | Switch.cs:172:42:172:44 | "3" |
2730+
| Switch.cs:173:17:173:22 | break; | Switch.cs:173:17:173:22 | break; |
2731+
| Switch.cs:174:13:174:20 | default: | Switch.cs:174:13:174:20 | default: |
2732+
| Switch.cs:175:17:175:47 | call to method WriteLine | Switch.cs:175:42:175:46 | "def" |
2733+
| Switch.cs:175:17:175:48 | ...; | Switch.cs:175:17:175:48 | ...; |
2734+
| Switch.cs:175:42:175:46 | "def" | Switch.cs:175:42:175:46 | "def" |
2735+
| Switch.cs:176:17:176:22 | break; | Switch.cs:176:17:176:22 | break; |
27142736
| TypeAccesses.cs:1:7:1:18 | call to constructor Object | TypeAccesses.cs:1:7:1:18 | call to constructor Object |
27152737
| TypeAccesses.cs:1:7:1:18 | {...} | TypeAccesses.cs:1:7:1:18 | {...} |
27162738
| TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:4:5:9:5 | {...} |

0 commit comments

Comments
 (0)