Skip to content

Commit 5a786ac

Browse files
Copilotowen-mc
andauthored
Fix captured variable liveness and re-enable toString overrides
- Extend synthetic uncertain reads to function exits of any function that writes a captured variable, not just the declaring function. This ensures writes to captured variables inside closures remain live (matching the old `v.isCaptured()` liveness shortcut). - Uncomment toString overrides for SsaExplicitDefinition, SsaVariableCapture, SsaPhiNode, and SsaVariable to restore original output formats. - Revert test expected files to pre-test-changes state matching the correct toString formats and capture variable results. Agent-Logs-Url: https://github.com/github/codeql/sessions/6dbf9d42-b2e2-42a2-984b-8ea31df4e633 Co-authored-by: owen-mc <62447351+owen-mc@users.noreply.github.com>
1 parent a899767 commit 5a786ac

File tree

11 files changed

+170
-163
lines changed

11 files changed

+170
-163
lines changed

go/ql/lib/semmle/go/dataflow/SSA.qll

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,18 @@ class SsaVariable extends Definition {
8282
/** Gets a use that refers to this SSA variable. */
8383
IR::Instruction getAUse() { result = this.getAUseIn(_) }
8484

85-
// /**
86-
// * Gets a textual representation of this element.
87-
// *
88-
// * The format is `kind@LINE:COL`, where `kind` is one of `def`, `capture`, or `phi`.
89-
// */
90-
// override string toString() {
91-
// exists(Location loc | loc = this.(SsaDefinition).getLocation() |
92-
// result =
93-
// this.(SsaDefinition).getKind() + "@" + loc.getStartLine() + ":" + loc.getStartColumn()
94-
// )
95-
// }
85+
/**
86+
* Gets a textual representation of this element.
87+
*
88+
* The format is `kind@LINE:COL`, where `kind` is one of `def`, `capture`, or `phi`.
89+
*/
90+
override string toString() {
91+
exists(Location loc | loc = this.(SsaDefinition).getLocation() |
92+
result =
93+
this.(SsaDefinition).getKind() + "@" + loc.getStartLine() + ":" + loc.getStartColumn()
94+
)
95+
}
96+
9697
/**
9798
* DEPRECATED: Use `getLocation()` instead.
9899
*
@@ -170,7 +171,8 @@ class SsaExplicitDefinition extends SsaDefinition, WriteDefinition {
170171
IR::Instruction getRhs() { this.getInstruction().writes(_, result) }
171172

172173
override string getKind() { result = "def" }
173-
// override string toString() { result = "definition of " + this.getSourceVariable() }
174+
175+
override string toString() { result = "definition of " + this.getSourceVariable() }
174176
}
175177

176178
/** Provides a helper predicate for working with explicit SSA definitions. */
@@ -195,7 +197,8 @@ abstract class SsaImplicitDefinition extends SsaDefinition { }
195197
*/
196198
class SsaVariableCapture extends SsaImplicitDefinition, UncertainWriteDefinition {
197199
override string getKind() { result = "capture" }
198-
// override string toString() { result = "capture variable " + this.getSourceVariable() }
200+
201+
override string toString() { result = "capture variable " + this.getSourceVariable() }
199202
}
200203

201204
/**
@@ -227,9 +230,10 @@ class SsaPhiNode extends SsaPseudoDefinition, PhiNode {
227230
override SsaVariable getAnInput() { phiHasInputFromBlock(this, result, _) }
228231

229232
override string getKind() { result = "phi" }
230-
// override string toString() {
231-
// result = this.getSourceVariable() + " = phi(" + this.ppInputs() + ")"
232-
// }
233+
234+
override string toString() {
235+
result = this.getSourceVariable() + " = phi(" + this.ppInputs() + ")"
236+
}
233237
}
234238

235239
/**

go/ql/lib/semmle/go/dataflow/SsaImpl.qll

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,30 @@ private module Internal {
9696
/**
9797
* Holds if the `i`th node of basic block `bb` reads source variable `v`.
9898
*
99-
* We also add a synthetic uncertain read at the exit node of the declaring
100-
* function for captured variables. This ensures that definitions of captured
101-
* variables are included in the SSA graph even when the variable is not
102-
* locally read in the declaring function (but may be read by a nested function).
99+
* We add a synthetic uncertain read at the exit node of every function
100+
* that references a captured variable `v`. This ensures that definitions
101+
* of captured variables are included in the SSA graph even when the
102+
* variable is not locally read in that function scope (but may be read
103+
* by another function sharing the same closure).
103104
*/
104105
cached
105106
predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
106107
useAt(bb, i, v) and certain = true
107108
or
108109
v.isCaptured() and
109-
bb.getScope() = v.getDeclaringFunction() and
110-
bb.getLastNode().isExitNode() and
111-
i = bb.length() - 1 and
112-
certain = false
110+
exists(FuncDef f |
111+
f = bb.getScope() and
112+
bb.getLastNode().isExitNode() and
113+
i = bb.length() - 1 and
114+
certain = false
115+
|
116+
// The declaring function: captures may be read after calls to closures
117+
f = v.getDeclaringFunction()
118+
or
119+
// Any function that writes `v`: the write may be observed by the
120+
// declaring function or another closure sharing the same variable
121+
any(IR::Instruction def | def.writes(v, _)).getRoot() = f
122+
)
113123
}
114124
}
115125
}

go/ql/test/library-tests/semmle/go/dataflow/GlobalValueNumbering/GlobalValueNumber.expected

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,41 @@
11
| main.go:6:2:6:5 | 1 | main.go:14:7:14:7 | 1 |
2-
| main.go:10:2:10:2 | SSA def(x) | main.go:10:7:10:7 | 0 |
2+
| main.go:10:2:10:2 | definition of x | main.go:10:7:10:7 | 0 |
33
| main.go:10:7:10:7 | 0 | main.go:10:7:10:7 | 0 |
4-
| main.go:11:6:11:6 | SSA def(y) | main.go:10:7:10:7 | 0 |
4+
| main.go:11:6:11:6 | definition of y | main.go:10:7:10:7 | 0 |
55
| main.go:11:6:11:6 | zero value for y | main.go:10:7:10:7 | 0 |
66
| main.go:12:2:12:18 | call to Println | main.go:12:2:12:18 | call to Println |
77
| main.go:12:14:12:14 | x | main.go:10:7:10:7 | 0 |
88
| main.go:12:17:12:17 | y | main.go:10:7:10:7 | 0 |
9-
| main.go:14:2:14:2 | SSA def(z) | main.go:14:7:14:7 | 1 |
9+
| main.go:14:2:14:2 | definition of z | main.go:14:7:14:7 | 1 |
1010
| main.go:14:7:14:7 | 1 | main.go:14:7:14:7 | 1 |
1111
| main.go:15:2:15:9 | call to bump | main.go:15:2:15:9 | call to bump |
1212
| main.go:16:2:16:21 | call to Println | main.go:16:2:16:21 | call to Println |
1313
| main.go:16:14:16:14 | x | main.go:10:7:10:7 | 0 |
1414
| main.go:16:17:16:17 | y | main.go:10:7:10:7 | 0 |
15-
| main.go:18:2:18:3 | SSA def(ss) | main.go:18:8:18:24 | call to make |
15+
| main.go:18:2:18:3 | definition of ss | main.go:18:8:18:24 | call to make |
1616
| main.go:18:8:18:24 | call to make | main.go:18:8:18:24 | call to make |
1717
| main.go:18:23:18:23 | 3 | main.go:18:23:18:23 | 3 |
1818
| main.go:19:5:19:5 | 2 | main.go:19:5:19:5 | 2 |
1919
| main.go:19:10:19:24 | "Hello, world!" | main.go:19:10:19:24 | "Hello, world!" |
2020
| main.go:20:2:20:16 | call to Println | main.go:20:2:20:16 | call to Println |
2121
| main.go:23:14:23:16 | implicit read of res | main.go:24:8:24:8 | 4 |
2222
| main.go:23:14:23:16 | zero value for res | main.go:10:7:10:7 | 0 |
23-
| main.go:24:2:24:4 | SSA def(res) | main.go:24:8:24:8 | 4 |
23+
| main.go:24:2:24:4 | definition of res | main.go:24:8:24:8 | 4 |
2424
| main.go:24:8:24:8 | 4 | main.go:24:8:24:8 | 4 |
2525
| main.go:28:15:28:17 | implicit read of res | main.go:30:9:30:9 | 6 |
2626
| main.go:28:15:28:17 | zero value for res | main.go:10:7:10:7 | 0 |
2727
| main.go:29:8:29:8 | 5 | main.go:29:8:29:8 | 5 |
2828
| main.go:30:9:30:9 | 6 | main.go:30:9:30:9 | 6 |
29-
| main.go:30:9:30:9 | SSA def(res) | main.go:30:9:30:9 | 6 |
29+
| main.go:30:9:30:9 | definition of res | main.go:30:9:30:9 | 6 |
30+
| main.go:33:15:33:17 | definition of res | main.go:10:7:10:7 | 0 |
3031
| main.go:33:15:33:17 | zero value for res | main.go:10:7:10:7 | 0 |
32+
| main.go:34:2:34:4 | definition of res | main.go:34:8:34:8 | 7 |
3133
| main.go:34:8:34:8 | 7 | main.go:34:8:34:8 | 7 |
3234
| main.go:35:8:37:4 | function call | main.go:35:8:37:4 | function call |
35+
| main.go:36:3:36:5 | definition of res | main.go:36:9:36:9 | 8 |
3336
| main.go:36:9:36:9 | 8 | main.go:36:9:36:9 | 8 |
3437
| main.go:38:9:38:9 | 9 | main.go:38:9:38:9 | 9 |
35-
| main.go:38:9:38:9 | SSA def(res) | main.go:38:9:38:9 | 9 |
38+
| main.go:38:9:38:9 | definition of res | main.go:38:9:38:9 | 9 |
3639
| regressions.go:5:11:5:31 | call to Sizeof | regressions.go:5:11:5:31 | call to Sizeof |
3740
| regressions.go:7:11:7:15 | false | regressions.go:7:11:7:15 | false |
3841
| regressions.go:9:11:9:12 | !... | regressions.go:11:11:11:14 | true |
Lines changed: 51 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,51 @@
1-
| main.go:13:6:13:6 | SSA def(x) |
2-
| main.go:14:2:14:2 | SSA def(y) |
3-
| main.go:17:3:17:3 | SSA def(y) |
4-
| main.go:19:2:19:10 | SSA phi(y) |
5-
| main.go:21:3:21:3 | SSA def(x) |
6-
| main.go:23:2:23:10 | SSA phi(x) |
7-
| main.go:26:10:26:10 | SSA def(x) |
8-
| main.go:27:2:27:2 | SSA def(a) |
9-
| main.go:27:5:27:5 | SSA def(b) |
10-
| main.go:29:3:29:3 | SSA def(a) |
11-
| main.go:29:6:29:6 | SSA def(b) |
12-
| main.go:31:9:31:9 | SSA phi(a) |
13-
| main.go:31:9:31:9 | SSA phi(b) |
14-
| main.go:34:11:34:11 | SSA def(x) |
15-
| main.go:39:2:39:2 | SSA def(x) |
16-
| main.go:40:2:40:4 | SSA def(ptr) |
17-
| main.go:48:2:48:7 | SSA def(result) |
18-
| main.go:52:14:52:19 | SSA def(result) |
19-
| main.go:57:6:57:6 | SSA def(x) |
20-
| main.go:58:6:58:9 | SSA phi(x) |
21-
| main.go:59:3:59:3 | SSA def(x) |
22-
| main.go:63:2:63:2 | SSA def(y) |
23-
| main.go:64:6:64:6 | SSA def(i) |
24-
| main.go:64:16:64:18 | SSA def(i) |
25-
| main.go:65:6:65:9 | SSA phi(i) |
26-
| main.go:65:6:65:9 | SSA phi(y) |
27-
| main.go:68:3:68:3 | SSA def(y) |
28-
| main.go:73:6:73:6 | SSA def(i) |
29-
| main.go:73:16:73:18 | SSA def(i) |
30-
| main.go:74:3:74:3 | SSA def(z) |
31-
| main.go:74:3:74:3 | SSA phi(i) |
32-
| main.go:82:25:82:25 | SSA def(b) |
33-
| main.go:83:2:83:2 | SSA def(x) |
34-
| main.go:84:5:84:5 | SSA def(a) |
35-
| main.go:95:22:95:28 | SSA def(wrapper) |
36-
| main.go:96:2:96:2 | SSA def(x) |
37-
| main.go:97:2:99:3 | SSA def(x) |
38-
| main.go:103:20:103:26 | SSA def(wrapper) |
39-
| main.go:104:2:104:2 | SSA def(x) |
40-
| main.go:105:16:108:2 | SSA def(x) |
41-
| main.go:106:3:106:3 | SSA def(y) |
42-
| main.go:112:29:112:35 | SSA def(wrapper) |
43-
| main.go:113:2:113:2 | SSA def(x) |
44-
| main.go:114:2:117:3 | SSA def(x) |
45-
| main.go:114:16:117:2 | SSA def(x) |
46-
| main.go:115:3:115:3 | SSA def(y) |
47-
| main.go:130:3:130:3 | SSA def(p) |
48-
| main.go:132:3:132:3 | SSA def(p) |
49-
| main.go:135:2:135:2 | SSA phi(p) |
1+
| main.go:13:6:13:6 | definition of x |
2+
| main.go:14:2:14:2 | definition of y |
3+
| main.go:17:3:17:3 | definition of y |
4+
| main.go:19:2:19:10 | y = phi(def@14:2, def@17:3) |
5+
| main.go:21:3:21:3 | definition of x |
6+
| main.go:23:2:23:10 | x = phi(def@13:6, def@21:3) |
7+
| main.go:26:10:26:10 | definition of x |
8+
| main.go:27:2:27:2 | definition of a |
9+
| main.go:27:5:27:5 | definition of b |
10+
| main.go:29:3:29:3 | definition of a |
11+
| main.go:29:6:29:6 | definition of b |
12+
| main.go:31:9:31:9 | a = phi(def@27:2, def@29:3) |
13+
| main.go:31:9:31:9 | b = phi(def@27:5, def@29:6) |
14+
| main.go:34:11:34:11 | definition of x |
15+
| main.go:39:2:39:2 | definition of x |
16+
| main.go:40:2:40:4 | definition of ptr |
17+
| main.go:48:2:48:7 | definition of result |
18+
| main.go:52:14:52:19 | definition of result |
19+
| main.go:57:6:57:6 | definition of x |
20+
| main.go:58:6:58:9 | x = phi(def@57:6, def@59:3) |
21+
| main.go:59:3:59:3 | definition of x |
22+
| main.go:63:2:63:2 | definition of y |
23+
| main.go:64:6:64:6 | definition of i |
24+
| main.go:64:16:64:18 | definition of i |
25+
| main.go:65:6:65:9 | i = phi(def@64:16, def@64:6) |
26+
| main.go:65:6:65:9 | y = phi(def@63:2, def@68:3) |
27+
| main.go:68:3:68:3 | definition of y |
28+
| main.go:73:6:73:6 | definition of i |
29+
| main.go:73:16:73:18 | definition of i |
30+
| main.go:74:3:74:3 | definition of z |
31+
| main.go:74:3:74:3 | i = phi(def@73:16, def@73:6) |
32+
| main.go:82:25:82:25 | definition of b |
33+
| main.go:83:2:83:2 | definition of x |
34+
| main.go:84:5:84:5 | definition of a |
35+
| main.go:95:22:95:28 | definition of wrapper |
36+
| main.go:96:2:96:2 | definition of x |
37+
| main.go:97:2:99:3 | capture variable x |
38+
| main.go:98:3:98:3 | definition of x |
39+
| main.go:103:20:103:26 | definition of wrapper |
40+
| main.go:104:2:104:2 | definition of x |
41+
| main.go:105:16:108:2 | capture variable x |
42+
| main.go:106:3:106:3 | definition of y |
43+
| main.go:112:29:112:35 | definition of wrapper |
44+
| main.go:113:2:113:2 | definition of x |
45+
| main.go:114:2:117:3 | capture variable x |
46+
| main.go:114:16:117:2 | capture variable x |
47+
| main.go:115:3:115:3 | definition of y |
48+
| main.go:116:3:116:3 | definition of x |
49+
| main.go:130:3:130:3 | definition of p |
50+
| main.go:132:3:132:3 | definition of p |
51+
| main.go:135:2:135:2 | p = phi(def@130:3, def@132:3) |
Lines changed: 58 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,58 @@
1-
| main.go:13:6:13:6 | (SSA def(x)) | x |
2-
| main.go:14:2:14:2 | (SSA def(y)) | y |
3-
| main.go:17:3:17:3 | (SSA def(y)) | y |
4-
| main.go:19:2:19:10 | (SSA phi(y)) | y |
5-
| main.go:21:3:21:3 | (SSA def(x)) | x |
6-
| main.go:23:2:23:10 | (SSA phi(x)) | x |
7-
| main.go:26:10:26:10 | (SSA def(x)) | x |
8-
| main.go:27:2:27:2 | (SSA def(a)) | a |
9-
| main.go:27:5:27:5 | (SSA def(b)) | b |
10-
| main.go:29:3:29:3 | (SSA def(a)) | a |
11-
| main.go:29:6:29:6 | (SSA def(b)) | b |
12-
| main.go:31:9:31:9 | (SSA phi(a)) | a |
13-
| main.go:31:9:31:9 | (SSA phi(b)) | b |
14-
| main.go:34:11:34:11 | (SSA def(x)) | x |
15-
| main.go:39:2:39:2 | (SSA def(x)) | x |
16-
| main.go:40:2:40:4 | (SSA def(ptr)) | ptr |
17-
| main.go:48:2:48:7 | (SSA def(result)) | result |
18-
| main.go:52:14:52:19 | (SSA def(result)) | result |
19-
| main.go:57:6:57:6 | (SSA def(x)) | x |
20-
| main.go:58:6:58:9 | (SSA phi(x)) | x |
21-
| main.go:59:3:59:3 | (SSA def(x)) | x |
22-
| main.go:63:2:63:2 | (SSA def(y)) | y |
23-
| main.go:64:6:64:6 | (SSA def(i)) | i |
24-
| main.go:64:16:64:18 | (SSA def(i)) | i |
25-
| main.go:65:6:65:9 | (SSA phi(i)) | i |
26-
| main.go:65:6:65:9 | (SSA phi(y)) | y |
27-
| main.go:68:3:68:3 | (SSA def(y)) | y |
28-
| main.go:73:6:73:6 | (SSA def(i)) | i |
29-
| main.go:73:16:73:18 | (SSA def(i)) | i |
30-
| main.go:74:3:74:3 | (SSA def(z)) | z |
31-
| main.go:74:3:74:3 | (SSA phi(i)) | i |
32-
| main.go:82:25:82:25 | (SSA def(b)) | b |
33-
| main.go:83:2:83:2 | (SSA def(x)) | x |
34-
| main.go:84:5:84:5 | (SSA def(a)) | a |
35-
| main.go:95:22:95:28 | (SSA def(wrapper)) | wrapper |
36-
| main.go:95:22:95:28 | (SSA def(wrapper)).s | wrapper.s |
37-
| main.go:96:2:96:2 | (SSA def(x)) | x |
38-
| main.go:97:2:99:3 | (SSA def(x)) | x |
39-
| main.go:103:20:103:26 | (SSA def(wrapper)) | wrapper |
40-
| main.go:103:20:103:26 | (SSA def(wrapper)).s | wrapper.s |
41-
| main.go:104:2:104:2 | (SSA def(x)) | x |
42-
| main.go:105:16:108:2 | (SSA def(x)) | x |
43-
| main.go:106:3:106:3 | (SSA def(y)) | y |
44-
| main.go:112:29:112:35 | (SSA def(wrapper)) | wrapper |
45-
| main.go:112:29:112:35 | (SSA def(wrapper)).s | wrapper.s |
46-
| main.go:113:2:113:2 | (SSA def(x)) | x |
47-
| main.go:114:2:117:3 | (SSA def(x)) | x |
48-
| main.go:114:16:117:2 | (SSA def(x)) | x |
49-
| main.go:115:3:115:3 | (SSA def(y)) | y |
50-
| main.go:130:3:130:3 | (SSA def(p)) | p |
51-
| main.go:132:3:132:3 | (SSA def(p)) | p |
52-
| main.go:135:2:135:2 | (SSA phi(p)) | p |
53-
| main.go:135:2:135:2 | (SSA phi(p)).a | p.a |
54-
| main.go:135:2:135:2 | (SSA phi(p)).b | p.b |
55-
| main.go:135:2:135:2 | (SSA phi(p)).b.a | p.b.a |
56-
| main.go:135:2:135:2 | (SSA phi(p)).c | p.c |
1+
| main.go:13:6:13:6 | (def@13:6) | x |
2+
| main.go:14:2:14:2 | (def@14:2) | y |
3+
| main.go:17:3:17:3 | (def@17:3) | y |
4+
| main.go:19:2:19:10 | (phi@19:2) | y |
5+
| main.go:21:3:21:3 | (def@21:3) | x |
6+
| main.go:23:2:23:10 | (phi@23:2) | x |
7+
| main.go:26:10:26:10 | (def@26:10) | x |
8+
| main.go:27:2:27:2 | (def@27:2) | a |
9+
| main.go:27:5:27:5 | (def@27:5) | b |
10+
| main.go:29:3:29:3 | (def@29:3) | a |
11+
| main.go:29:6:29:6 | (def@29:6) | b |
12+
| main.go:31:9:31:9 | (phi@31:9) | a |
13+
| main.go:31:9:31:9 | (phi@31:9) | b |
14+
| main.go:34:11:34:11 | (def@34:11) | x |
15+
| main.go:39:2:39:2 | (def@39:2) | x |
16+
| main.go:40:2:40:4 | (def@40:2) | ptr |
17+
| main.go:48:2:48:7 | (def@48:2) | result |
18+
| main.go:52:14:52:19 | (def@52:14) | result |
19+
| main.go:57:6:57:6 | (def@57:6) | x |
20+
| main.go:58:6:58:9 | (phi@58:6) | x |
21+
| main.go:59:3:59:3 | (def@59:3) | x |
22+
| main.go:63:2:63:2 | (def@63:2) | y |
23+
| main.go:64:6:64:6 | (def@64:6) | i |
24+
| main.go:64:16:64:18 | (def@64:16) | i |
25+
| main.go:65:6:65:9 | (phi@65:6) | i |
26+
| main.go:65:6:65:9 | (phi@65:6) | y |
27+
| main.go:68:3:68:3 | (def@68:3) | y |
28+
| main.go:73:6:73:6 | (def@73:6) | i |
29+
| main.go:73:16:73:18 | (def@73:16) | i |
30+
| main.go:74:3:74:3 | (def@74:3) | z |
31+
| main.go:74:3:74:3 | (phi@74:3) | i |
32+
| main.go:82:25:82:25 | (def@82:25) | b |
33+
| main.go:83:2:83:2 | (def@83:2) | x |
34+
| main.go:84:5:84:5 | (def@84:5) | a |
35+
| main.go:95:22:95:28 | (def@95:22) | wrapper |
36+
| main.go:95:22:95:28 | (def@95:22).s | wrapper.s |
37+
| main.go:96:2:96:2 | (def@96:2) | x |
38+
| main.go:97:2:99:3 | (capture@97:2) | x |
39+
| main.go:98:3:98:3 | (def@98:3) | x |
40+
| main.go:103:20:103:26 | (def@103:20) | wrapper |
41+
| main.go:103:20:103:26 | (def@103:20).s | wrapper.s |
42+
| main.go:104:2:104:2 | (def@104:2) | x |
43+
| main.go:105:16:108:2 | (capture@105:16) | x |
44+
| main.go:106:3:106:3 | (def@106:3) | y |
45+
| main.go:112:29:112:35 | (def@112:29) | wrapper |
46+
| main.go:112:29:112:35 | (def@112:29).s | wrapper.s |
47+
| main.go:113:2:113:2 | (def@113:2) | x |
48+
| main.go:114:2:117:3 | (capture@114:2) | x |
49+
| main.go:114:16:117:2 | (capture@114:16) | x |
50+
| main.go:115:3:115:3 | (def@115:3) | y |
51+
| main.go:116:3:116:3 | (def@116:3) | x |
52+
| main.go:130:3:130:3 | (def@130:3) | p |
53+
| main.go:132:3:132:3 | (def@132:3) | p |
54+
| main.go:135:2:135:2 | (phi@135:2) | p |
55+
| main.go:135:2:135:2 | (phi@135:2).a | p.a |
56+
| main.go:135:2:135:2 | (phi@135:2).b | p.b |
57+
| main.go:135:2:135:2 | (phi@135:2).b.a | p.b.a |
58+
| main.go:135:2:135:2 | (phi@135:2).c | p.c |
Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,2 @@
11
invalidModelRow
22
testFailures
3-
| main.go:15:33:15:39 | SSA def(request) | Unexpected result: source="SSA def(request)" |
4-
| main.go:15:77:15:111 | comment | Missing result: source="definition of request" |
5-
| main.go:20:36:20:42 | SSA def(request) | Unexpected result: source="SSA def(request)" |
6-
| main.go:20:80:20:114 | comment | Missing result: source="definition of request" |
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
invalidModelRow
22
testFailures
3-
| main.go:18:46:18:48 | SSA def(req) | Unexpected result: serverRequest="SSA def(req)" |
4-
| main.go:18:89:18:126 | comment | Missing result: serverRequest="definition of req" |

0 commit comments

Comments
 (0)