Guards: remove default-case outcome hook · github/codeql@6aedc51 · GitHub
Skip to content

Commit 6aedc51

Browse files
owen-mcCopilot
andcommitted
Guards: remove default-case outcome hook
Align Go with Java and C# by deriving useful default-branch facts from the preceding non-match edges rather than treating the default clause itself as a true guard. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 480e631 commit 6aedc51

5 files changed

Lines changed: 4 additions & 59 deletions

File tree

‎go/ql/lib/semmle/go/controlflow/Guards.qll‎

Lines changed: 0 additions & 10 deletions

‎go/ql/test/library-tests/semmle/go/controlflow/Guards/Guards.expected‎

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@ controlsResult
44
| guards.go:12:7:12:15 | ...<... | zero | false |
55
| guards.go:14:7:14:16 | ...==... | positive | false |
66
| guards.go:14:7:14:16 | ...==... | zero | true |
7-
| guards.go:16:2:17:18 | case clause | positive | true |
87
| guards.go:23:2:24:21 | case clause | tagged one or two | false |
98
| guards.go:23:2:24:21 | case clause | tagged other | false |
109
| guards.go:23:2:24:21 | case clause | tagged zero | true |
1110
| guards.go:25:2:26:27 | case clause | tagged other | false |
12-
| guards.go:27:2:28:22 | case clause | tagged other | true |
1311
| guards.go:34:2:35:30 | case clause | tagged false boolean | true |
1412
| guards.go:34:7:34:11 | value | tagged false boolean | false |
1513
| guards.go:38:2:39:29 | case clause | tagged true boolean | true |
@@ -42,14 +40,10 @@ controlsResult
4240
| guards.go:126:5:126:28 | ...==... | source non-nil return | true |
4341
| guards.go:137:2:138:26 | case clause | default case | false |
4442
| guards.go:137:2:138:26 | case clause | non-default case | true |
45-
| guards.go:139:2:140:22 | case clause | default case | true |
46-
| guards.go:146:2:147:29 | case clause | default before case | true |
4743
| guards.go:148:2:149:28 | case clause | case after default | true |
4844
| guards.go:148:2:149:28 | case clause | default before case | false |
49-
| guards.go:155:2:156:22 | case clause | default only | true |
5045
| guards.go:162:7:162:11 | value | expressionless case | true |
5146
| guards.go:162:7:162:11 | value | expressionless default | false |
52-
| guards.go:164:2:165:32 | case clause | expressionless default | true |
5347
| guards.go:183:5:183:21 | call to isNotNil | non-variadic wrapper | true |
5448
| guards.go:194:5:194:32 | call to namedResultIsNotNil | named result wrapper | true |
5549
| guards.go:208:5:208:43 | call to conditionalNamedResultIsNotNil | conditional named result wrapper | true |
@@ -75,7 +69,6 @@ valueControlsResult
7569
| guards.go:14:7:14:11 | value | zero | 0 |
7670
| guards.go:14:7:14:16 | ...==... | positive | false |
7771
| guards.go:14:7:14:16 | ...==... | zero | true |
78-
| guards.go:16:2:17:18 | case clause | positive | true |
7972
| guards.go:22:9:22:13 | value | tagged one or two | not 0 |
8073
| guards.go:22:9:22:13 | value | tagged other | not 0 |
8174
| guards.go:22:9:22:13 | value | tagged other | not 1 |
@@ -85,7 +78,6 @@ valueControlsResult
8578
| guards.go:23:2:24:21 | case clause | tagged other | false |
8679
| guards.go:23:2:24:21 | case clause | tagged zero | true |
8780
| guards.go:25:2:26:27 | case clause | tagged other | false |
88-
| guards.go:27:2:28:22 | case clause | tagged other | true |
8981
| guards.go:34:2:35:30 | case clause | tagged false boolean | true |
9082
| guards.go:34:7:34:11 | value | tagged false boolean | false |
9183
| guards.go:38:2:39:29 | case clause | tagged true boolean | true |
@@ -150,16 +142,12 @@ valueControlsResult
150142
| guards.go:136:9:136:13 | value | non-default case | 0 |
151143
| guards.go:137:2:138:26 | case clause | default case | false |
152144
| guards.go:137:2:138:26 | case clause | non-default case | true |
153-
| guards.go:139:2:140:22 | case clause | default case | true |
154145
| guards.go:145:9:145:13 | value | case after default | 0 |
155146
| guards.go:145:9:145:13 | value | default before case | not 0 |
156-
| guards.go:146:2:147:29 | case clause | default before case | true |
157147
| guards.go:148:2:149:28 | case clause | case after default | true |
158148
| guards.go:148:2:149:28 | case clause | default before case | false |
159-
| guards.go:155:2:156:22 | case clause | default only | true |
160149
| guards.go:162:7:162:11 | value | expressionless case | true |
161150
| guards.go:162:7:162:11 | value | expressionless default | false |
162-
| guards.go:164:2:165:32 | case clause | expressionless default | true |
163151
| guards.go:183:5:183:21 | call to isNotNil | non-variadic wrapper | no exception |
164152
| guards.go:183:5:183:21 | call to isNotNil | non-variadic wrapper | true |
165153
| guards.go:183:14:183:20 | pointer | non-variadic wrapper | not null |
@@ -265,13 +253,6 @@ ensuresEqResult
265253
| guards.go:383:5:383:34 | ...==... | nil = call to modelNullGuard | true |
266254
| guards.go:386:5:386:37 | ...!=... | call to modelNotNullGuard = nil | false |
267255
| guards.go:386:5:386:37 | ...!=... | nil = call to modelNotNullGuard | false |
268-
defaultCaseResult
269-
| guards.go:16:2:17:18 | case clause | positive | true |
270-
| guards.go:27:2:28:22 | case clause | tagged other | true |
271-
| guards.go:139:2:140:22 | case clause | default case | true |
272-
| guards.go:146:2:147:29 | case clause | default before case | true |
273-
| guards.go:155:2:156:22 | case clause | default only | true |
274-
| guards.go:164:2:165:32 | case clause | expressionless default | true |
275256
modelBarrierResult
276257
| guards.go:375:27:375:33 | pointer | model bool | model-bool |
277258
| guards.go:378:27:378:33 | pointer | model zero | model-zero |

‎go/ql/test/library-tests/semmle/go/controlflow/Guards/Guards.ql‎

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,6 @@ query predicate ensuresEqResult(Guard guard, string label, string outcome) {
3131
)
3232
}
3333

34-
query predicate defaultCaseResult(Guard guard, string label, string outcome) {
35-
exists(DataFlow::CallNode call, GuardValue value, CaseClause defaultCase |
36-
sinkCall(call, label) and
37-
defaultCase = any(ExpressionSwitchStmt switch).getDefault() and
38-
guard = defaultCase and
39-
guard.valueControls(call.getBasicBlock(), value) and
40-
outcome = value.toString()
41-
)
42-
}
43-
4434
query predicate modelBarrierResult(DataFlow::Node node, string label, string kind) {
4535
exists(DataFlow::CallNode call |
4636
call.getTarget().getName() = "valueSink" and

‎go/ql/test/library-tests/semmle/go/controlflow/Guards/guards.go‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,14 @@ func defaultCase(value int) {
137137
case 0:
138138
sink("non-default case")
139139
default:
140-
sink("default case") // default case matches
140+
sink("default case")
141141
}
142142
}
143143

144144
func defaultBeforeCase(value int) {
145145
switch value {
146146
default:
147-
sink("default before case") // default case matches
147+
sink("default before case")
148148
case 0:
149149
sink("case after default")
150150
}
@@ -153,7 +153,7 @@ func defaultBeforeCase(value int) {
153153
func defaultOnly(value int) {
154154
switch value {
155155
default:
156-
sink("default only") // default case matches
156+
sink("default only") // No guard fact: matching the only case is tautological.
157157
}
158158
}
159159

@@ -162,7 +162,7 @@ func expressionlessDefault(value bool) {
162162
case value:
163163
sink("expressionless case")
164164
default:
165-
sink("expressionless default") // default case matches
165+
sink("expressionless default")
166166
}
167167
}
168168

‎shared/controlflow/codeql/controlflow/Guards.qll‎

Lines changed: 0 additions & 16 deletions

0 commit comments

Comments
 (0)