Skip to content

Commit b55e294

Browse files
authored
Merge pull request github#1986 from calumgrant/cs/switch-cfg
C#: Fix CFG for switch statements where the default case is not the last
2 parents 0e478d1 + 28c34ad commit b55e294

File tree

14 files changed

+331
-13
lines changed

14 files changed

+331
-13
lines changed

change-notes/1.23/analysis-csharp.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@ The following changes in version 1.23 affect C# analysis in all applications.
3939
disabled by default and can be enabled for individual configurations by
4040
overriding `int explorationLimit()`.
4141
* `foreach` statements where the body is guaranteed to be executed at least once, such as `foreach (var x in new string[]{ "a", "b", "c" }) { ... }`, are now recognized by all analyses based on the control flow graph (such as SSA, data flow and taint tracking).
42+
* Fixed the control flow graph for `switch` statements where the `default` case was not the last case. This had caused the remaining cases to be unreachable. `SwitchStmt.getCase(int i)` now puts the `default` case last.
4243

4344
## Changes to autobuilder

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ class SwitchStmt extends SelectionStmt, Switch, @switch_stmt {
165165
* return 3;
166166
* }
167167
* ```
168+
* Note that this reorders the `default` case to always be at the end.
168169
*/
169170
override CaseStmt getCase(int i) { result = SwithStmtInternal::getCase(this, i) }
170171

@@ -215,9 +216,18 @@ private module SwithStmtInternal {
215216
cached
216217
CaseStmt getCase(SwitchStmt ss, int i) {
217218
exists(int index, int rankIndex |
218-
result = ss.getChildStmt(index) and
219+
caseIndex(ss, result, index) and
219220
rankIndex = i + 1 and
220-
index = rank[rankIndex](int j, CaseStmt cs | cs = ss.getChildStmt(j) | j)
221+
index = rank[rankIndex](int j, CaseStmt cs | caseIndex(ss, cs, j) | j)
222+
)
223+
}
224+
225+
/** Implicitly reorder case statements to put the default case last if needed. */
226+
private predicate caseIndex(SwitchStmt ss, CaseStmt case, int index) {
227+
exists(int i | case = ss.getChildStmt(i) |
228+
if case instanceof DefaultCase
229+
then index = max(int j | exists(ss.getChildStmt(j))) + 1
230+
else index = i
221231
)
222232
}
223233

csharp/ql/src/semmle/code/csharp/controlflow/ControlFlowGraph.qll

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,6 @@ module ControlFlow {
741741
TLastRecBooleanNegationCompletion() or
742742
TLastRecNonBooleanCompletion() or
743743
TLastRecBreakCompletion() or
744-
TLastRecNonBreakCompletion() or
745744
TLastRecSwitchAbnormalCompletion() or
746745
TLastRecInvalidOperationException() or
747746
TLastRecNonContinueCompletion() or
@@ -947,12 +946,6 @@ module ControlFlow {
947946
result = cs.getCondition() and
948947
c = specificBoolean(false)
949948
)
950-
or
951-
// Last statement exits with any non-break completion
952-
exists(int last | last = max(int i | exists(ss.getStmt(i))) |
953-
result = ss.getStmt(last) and
954-
c = TRec(TLastRecNonBreakCompletion())
955-
)
956949
)
957950
or
958951
cfe = any(SwitchExpr se |
@@ -1156,10 +1149,6 @@ module ControlFlow {
11561149
c0 instanceof BreakCompletion and
11571150
c instanceof BreakNormalCompletion
11581151
or
1159-
rec = TLastRecNonBreakCompletion() and
1160-
not c0 instanceof BreakCompletion and
1161-
c = c0
1162-
or
11631152
rec = TLastRecSwitchAbnormalCompletion() and
11641153
not c instanceof BreakCompletion and
11651154
not c instanceof NormalCompletion and

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,18 @@
555555
| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:40:131:40 | access to local variable s | 1 |
556556
| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:48:131:51 | null | 3 |
557557
| Switch.cs:131:56:131:66 | call to method ToString | Switch.cs:131:56:131:66 | call to method ToString | 1 |
558+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:139:18:139:18 | 1 | 6 |
559+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:134:9:134:11 | exit M13 | 1 |
560+
| Switch.cs:138:13:138:20 | default: | Switch.cs:138:22:138:31 | return ...; | 4 |
561+
| Switch.cs:139:28:139:28 | 1 | Switch.cs:139:21:139:29 | return ...; | 2 |
562+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:18:140:18 | 2 | 2 |
563+
| Switch.cs:140:28:140:28 | 2 | Switch.cs:140:21:140:29 | return ...; | 2 |
564+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:148:18:148:18 | 1 | 6 |
565+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:144:9:144:11 | exit M14 | 1 |
566+
| Switch.cs:148:28:148:28 | 1 | Switch.cs:148:21:148:29 | return ...; | 2 |
567+
| Switch.cs:149:13:149:20 | default: | Switch.cs:149:22:149:31 | return ...; | 4 |
568+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:18:150:18 | 2 | 2 |
569+
| Switch.cs:150:28:150:28 | 2 | Switch.cs:150:21:150:29 | return ...; | 2 |
558570
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:13:7:22 | ... is ... | 14 |
559571
| TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; | 1 |
560572
| TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | exit M | 4 |

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,18 @@ conditionBlock
603603
| Switch.cs:129:12:129:14 | enter M12 | Switch.cs:131:43:131:51 | ... => ... | false |
604604
| Switch.cs:129:12:129:14 | enter M12 | Switch.cs:131:56:131:66 | call to method ToString | true |
605605
| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:56:131:66 | call to method ToString | false |
606+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:138:13:138:20 | default: | false |
607+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:139:28:139:28 | 1 | true |
608+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:140:13:140:19 | case ...: | false |
609+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:140:28:140:28 | 2 | false |
610+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:138:13:138:20 | default: | false |
611+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:28:140:28 | 2 | true |
612+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:148:28:148:28 | 1 | true |
613+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:149:13:149:20 | default: | false |
614+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:150:13:150:19 | case ...: | false |
615+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:150:28:150:28 | 2 | false |
616+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:149:13:149:20 | default: | false |
617+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:28:150:28 | 2 | true |
606618
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:25:7:25 | ; | true |
607619
| VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:25:24:25:24 | access to local variable x | true |
608620
| VarDecls.cs:19:7:19:8 | enter M3 | VarDecls.cs:25:28:25:28 | access to local variable y | false |

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ breakInvariant2
44
breakInvariant3
55
breakInvariant4
66
breakInvariant5
7+
multipleSuccessors

csharp/ql/test/library-tests/controlflow/graph/Consistency.ql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,10 @@ query predicate breakInvariant5(
9494
not (split.hasSuccessor(pred, succ, c) and split = predSplits.getASplit()) and
9595
not (split.hasEntry(pred, succ, c) and not split = predSplits.getASplit())
9696
}
97+
98+
query predicate multipleSuccessors(
99+
ControlFlow::Node node, SuccessorType t, ControlFlow::Node successor
100+
) {
101+
strictcount(node.getASuccessorByType(t)) > 1 and
102+
successor = node.getASuccessorByType(t)
103+
}

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

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2249,6 +2249,36 @@ dominance
22492249
| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:56:131:66 | call to method ToString |
22502250
| Switch.cs:131:43:131:43 | _ | Switch.cs:131:48:131:51 | null |
22512251
| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:43 | _ |
2252+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:135:5:142:5 | {...} |
2253+
| Switch.cs:135:5:142:5 | {...} | Switch.cs:136:9:141:9 | switch (...) {...} |
2254+
| Switch.cs:136:9:141:9 | switch (...) {...} | Switch.cs:136:17:136:17 | access to parameter i |
2255+
| Switch.cs:136:17:136:17 | access to parameter i | Switch.cs:139:13:139:19 | case ...: |
2256+
| Switch.cs:138:13:138:20 | default: | Switch.cs:138:30:138:30 | 1 |
2257+
| Switch.cs:138:29:138:30 | -... | Switch.cs:138:22:138:31 | return ...; |
2258+
| Switch.cs:138:30:138:30 | 1 | Switch.cs:138:29:138:30 | -... |
2259+
| Switch.cs:139:13:139:19 | case ...: | Switch.cs:139:18:139:18 | 1 |
2260+
| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:28:139:28 | 1 |
2261+
| Switch.cs:139:18:139:18 | 1 | Switch.cs:140:13:140:19 | case ...: |
2262+
| Switch.cs:139:28:139:28 | 1 | Switch.cs:139:21:139:29 | return ...; |
2263+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:18:140:18 | 2 |
2264+
| Switch.cs:140:18:140:18 | 2 | Switch.cs:138:13:138:20 | default: |
2265+
| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:28:140:28 | 2 |
2266+
| Switch.cs:140:28:140:28 | 2 | Switch.cs:140:21:140:29 | return ...; |
2267+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:145:5:152:5 | {...} |
2268+
| Switch.cs:145:5:152:5 | {...} | Switch.cs:146:9:151:9 | switch (...) {...} |
2269+
| Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:146:17:146:17 | access to parameter i |
2270+
| Switch.cs:146:17:146:17 | access to parameter i | Switch.cs:148:13:148:19 | case ...: |
2271+
| Switch.cs:148:13:148:19 | case ...: | Switch.cs:148:18:148:18 | 1 |
2272+
| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:28:148:28 | 1 |
2273+
| Switch.cs:148:18:148:18 | 1 | Switch.cs:150:13:150:19 | case ...: |
2274+
| Switch.cs:148:28:148:28 | 1 | Switch.cs:148:21:148:29 | return ...; |
2275+
| Switch.cs:149:13:149:20 | default: | Switch.cs:149:30:149:30 | 1 |
2276+
| Switch.cs:149:29:149:30 | -... | Switch.cs:149:22:149:31 | return ...; |
2277+
| Switch.cs:149:30:149:30 | 1 | Switch.cs:149:29:149:30 | -... |
2278+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:18:150:18 | 2 |
2279+
| Switch.cs:150:18:150:18 | 2 | Switch.cs:149:13:149:20 | default: |
2280+
| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:28:150:28 | 2 |
2281+
| Switch.cs:150:28:150:28 | 2 | Switch.cs:150:21:150:29 | return ...; |
22522282
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:4:5:9:5 | {...} |
22532283
| TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:5:9:5:26 | ... ...; |
22542284
| TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:5:25:5:25 | access to parameter o |
@@ -5092,6 +5122,34 @@ postDominance
50925122
| Switch.cs:131:28:131:40 | ... => ... | Switch.cs:131:17:131:17 | access to parameter o |
50935123
| Switch.cs:131:43:131:43 | _ | Switch.cs:131:43:131:51 | ... => ... |
50945124
| Switch.cs:131:48:131:51 | null | Switch.cs:131:43:131:43 | _ |
5125+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:138:22:138:31 | return ...; |
5126+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:139:21:139:29 | return ...; |
5127+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:140:21:140:29 | return ...; |
5128+
| Switch.cs:135:5:142:5 | {...} | Switch.cs:134:9:134:11 | enter M13 |
5129+
| Switch.cs:136:9:141:9 | switch (...) {...} | Switch.cs:135:5:142:5 | {...} |
5130+
| Switch.cs:136:17:136:17 | access to parameter i | Switch.cs:136:9:141:9 | switch (...) {...} |
5131+
| Switch.cs:138:22:138:31 | return ...; | Switch.cs:138:29:138:30 | -... |
5132+
| Switch.cs:138:29:138:30 | -... | Switch.cs:138:30:138:30 | 1 |
5133+
| Switch.cs:138:30:138:30 | 1 | Switch.cs:138:13:138:20 | default: |
5134+
| Switch.cs:139:13:139:19 | case ...: | Switch.cs:136:17:136:17 | access to parameter i |
5135+
| Switch.cs:139:18:139:18 | 1 | Switch.cs:139:13:139:19 | case ...: |
5136+
| Switch.cs:139:21:139:29 | return ...; | Switch.cs:139:28:139:28 | 1 |
5137+
| Switch.cs:140:18:140:18 | 2 | Switch.cs:140:13:140:19 | case ...: |
5138+
| Switch.cs:140:21:140:29 | return ...; | Switch.cs:140:28:140:28 | 2 |
5139+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:148:21:148:29 | return ...; |
5140+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:149:22:149:31 | return ...; |
5141+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:150:21:150:29 | return ...; |
5142+
| Switch.cs:145:5:152:5 | {...} | Switch.cs:144:9:144:11 | enter M14 |
5143+
| Switch.cs:146:9:151:9 | switch (...) {...} | Switch.cs:145:5:152:5 | {...} |
5144+
| Switch.cs:146:17:146:17 | access to parameter i | Switch.cs:146:9:151:9 | switch (...) {...} |
5145+
| Switch.cs:148:13:148:19 | case ...: | Switch.cs:146:17:146:17 | access to parameter i |
5146+
| Switch.cs:148:18:148:18 | 1 | Switch.cs:148:13:148:19 | case ...: |
5147+
| Switch.cs:148:21:148:29 | return ...; | Switch.cs:148:28:148:28 | 1 |
5148+
| Switch.cs:149:22:149:31 | return ...; | Switch.cs:149:29:149:30 | -... |
5149+
| Switch.cs:149:29:149:30 | -... | Switch.cs:149:30:149:30 | 1 |
5150+
| Switch.cs:149:30:149:30 | 1 | Switch.cs:149:13:149:20 | default: |
5151+
| Switch.cs:150:18:150:18 | 2 | Switch.cs:150:13:150:19 | case ...: |
5152+
| Switch.cs:150:21:150:29 | return ...; | Switch.cs:150:28:150:28 | 2 |
50955153
| TypeAccesses.cs:3:10:3:10 | exit M | TypeAccesses.cs:8:13:8:27 | Type t = ... |
50965154
| TypeAccesses.cs:4:5:9:5 | {...} | TypeAccesses.cs:3:10:3:10 | enter M |
50975155
| TypeAccesses.cs:5:9:5:26 | ... ...; | TypeAccesses.cs:4:5:9:5 | {...} |
@@ -7350,6 +7408,32 @@ blockDominance
73507408
| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:56:131:66 | call to method ToString |
73517409
| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:51 | ... => ... |
73527410
| Switch.cs:131:56:131:66 | call to method ToString | Switch.cs:131:56:131:66 | call to method ToString |
7411+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:134:9:134:11 | enter M13 |
7412+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:134:9:134:11 | exit M13 |
7413+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:138:13:138:20 | default: |
7414+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:139:28:139:28 | 1 |
7415+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:140:13:140:19 | case ...: |
7416+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:140:28:140:28 | 2 |
7417+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:134:9:134:11 | exit M13 |
7418+
| Switch.cs:138:13:138:20 | default: | Switch.cs:138:13:138:20 | default: |
7419+
| Switch.cs:139:28:139:28 | 1 | Switch.cs:139:28:139:28 | 1 |
7420+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:138:13:138:20 | default: |
7421+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:13:140:19 | case ...: |
7422+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:28:140:28 | 2 |
7423+
| Switch.cs:140:28:140:28 | 2 | Switch.cs:140:28:140:28 | 2 |
7424+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:144:9:144:11 | enter M14 |
7425+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:144:9:144:11 | exit M14 |
7426+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:148:28:148:28 | 1 |
7427+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:149:13:149:20 | default: |
7428+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:150:13:150:19 | case ...: |
7429+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:150:28:150:28 | 2 |
7430+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:144:9:144:11 | exit M14 |
7431+
| Switch.cs:148:28:148:28 | 1 | Switch.cs:148:28:148:28 | 1 |
7432+
| Switch.cs:149:13:149:20 | default: | Switch.cs:149:13:149:20 | default: |
7433+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:149:13:149:20 | default: |
7434+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:13:150:19 | case ...: |
7435+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:28:150:28 | 2 |
7436+
| Switch.cs:150:28:150:28 | 2 | Switch.cs:150:28:150:28 | 2 |
73537437
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M |
73547438
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:7:25:7:25 | ; |
73557439
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:8:9:8:28 | ... ...; |
@@ -9031,6 +9115,28 @@ postBlockDominance
90319115
| Switch.cs:131:40:131:40 | access to local variable s | Switch.cs:131:40:131:40 | access to local variable s |
90329116
| Switch.cs:131:43:131:51 | ... => ... | Switch.cs:131:43:131:51 | ... => ... |
90339117
| Switch.cs:131:56:131:66 | call to method ToString | Switch.cs:131:56:131:66 | call to method ToString |
9118+
| Switch.cs:134:9:134:11 | enter M13 | Switch.cs:134:9:134:11 | enter M13 |
9119+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:134:9:134:11 | enter M13 |
9120+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:134:9:134:11 | exit M13 |
9121+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:138:13:138:20 | default: |
9122+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:139:28:139:28 | 1 |
9123+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:140:13:140:19 | case ...: |
9124+
| Switch.cs:134:9:134:11 | exit M13 | Switch.cs:140:28:140:28 | 2 |
9125+
| Switch.cs:138:13:138:20 | default: | Switch.cs:138:13:138:20 | default: |
9126+
| Switch.cs:139:28:139:28 | 1 | Switch.cs:139:28:139:28 | 1 |
9127+
| Switch.cs:140:13:140:19 | case ...: | Switch.cs:140:13:140:19 | case ...: |
9128+
| Switch.cs:140:28:140:28 | 2 | Switch.cs:140:28:140:28 | 2 |
9129+
| Switch.cs:144:9:144:11 | enter M14 | Switch.cs:144:9:144:11 | enter M14 |
9130+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:144:9:144:11 | enter M14 |
9131+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:144:9:144:11 | exit M14 |
9132+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:148:28:148:28 | 1 |
9133+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:149:13:149:20 | default: |
9134+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:150:13:150:19 | case ...: |
9135+
| Switch.cs:144:9:144:11 | exit M14 | Switch.cs:150:28:150:28 | 2 |
9136+
| Switch.cs:148:28:148:28 | 1 | Switch.cs:148:28:148:28 | 1 |
9137+
| Switch.cs:149:13:149:20 | default: | Switch.cs:149:13:149:20 | default: |
9138+
| Switch.cs:150:13:150:19 | case ...: | Switch.cs:150:13:150:19 | case ...: |
9139+
| Switch.cs:150:28:150:28 | 2 | Switch.cs:150:28:150:28 | 2 |
90349140
| TypeAccesses.cs:3:10:3:10 | enter M | TypeAccesses.cs:3:10:3:10 | enter M |
90359141
| TypeAccesses.cs:7:25:7:25 | ; | TypeAccesses.cs:7:25:7:25 | ; |
90369142
| TypeAccesses.cs:8:9:8:28 | ... ...; | TypeAccesses.cs:3:10:3:10 | enter M |

0 commit comments

Comments
 (0)