Skip to content

Commit 213d016

Browse files
committed
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 c2c68d5 commit 213d016

5 files changed

Lines changed: 147 additions & 137 deletions

File tree

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: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
| main.go:6:2:6:5 | 1 | main.go:14:7:14:7 | 1 |
2-
| main.go:10:2:10:2 | definition of x | main.go:10:7:10:7 | 0 |
2+
| main.go:10:2:10:2 | SSA def(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 | definition of y | main.go:10:7:10:7 | 0 |
4+
| main.go:11:6:11:6 | SSA def(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 | definition of z | main.go:14:7:14:7 | 1 |
9+
| main.go:14:2:14:2 | SSA def(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 | definition of ss | main.go:18:8:18:24 | call to make |
15+
| main.go:18:2:18:3 | SSA def(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 | definition of res | main.go:24:8:24:8 | 4 |
23+
| main.go:24:2:24:4 | SSA def(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 |
@@ -32,10 +32,10 @@
3232
| main.go:34:2:34:4 | definition of res | main.go:34:8:34:8 | 7 |
3333
| main.go:34:8:34:8 | 7 | main.go:34:8:34:8 | 7 |
3434
| 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 |
35+
| main.go:36:3:36:5 | SSA def(res) | main.go:36:9:36:9 | 8 |
3636
| main.go:36:9:36:9 | 8 | main.go:36:9:36:9 | 8 |
3737
| main.go:38:9:38:9 | 9 | main.go:38:9:38:9 | 9 |
38-
| main.go:38:9:38:9 | definition of res | main.go:38:9:38:9 | 9 |
38+
| main.go:38:9:38:9 | SSA def(res) | main.go:38:9:38:9 | 9 |
3939
| regressions.go:5:11:5:31 | call to Sizeof | regressions.go:5:11:5:31 | call to Sizeof |
4040
| regressions.go:7:11:7:15 | false | regressions.go:7:11:7:15 | false |
4141
| regressions.go:9:11:9:12 | !... | regressions.go:11:11:11:14 | true |
Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,51 @@
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) |
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:98:3:98:3 | SSA def(x) |
39+
| main.go:103:20:103:26 | SSA def(wrapper) |
40+
| main.go:104:2:104:2 | SSA def(x) |
41+
| main.go:105:16:108:2 | SSA def(x) |
42+
| main.go:106:3:106:3 | SSA def(y) |
43+
| main.go:112:29:112:35 | SSA def(wrapper) |
44+
| main.go:113:2:113:2 | SSA def(x) |
45+
| main.go:114:2:117:3 | SSA def(x) |
46+
| main.go:114:16:117:2 | SSA def(x) |
47+
| main.go:115:3:115:3 | SSA def(y) |
48+
| main.go:116:3:116:3 | SSA def(x) |
49+
| main.go:130:3:130:3 | SSA def(p) |
50+
| main.go:132:3:132:3 | SSA def(p) |
51+
| main.go:135:2:135:2 | SSA phi(p) |
Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,58 @@
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 |
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:98:3:98:3 | (SSA def(x)) | x |
40+
| main.go:103:20:103:26 | (SSA def(wrapper)) | wrapper |
41+
| main.go:103:20:103:26 | (SSA def(wrapper)).s | wrapper.s |
42+
| main.go:104:2:104:2 | (SSA def(x)) | x |
43+
| main.go:105:16:108:2 | (SSA def(x)) | x |
44+
| main.go:106:3:106:3 | (SSA def(y)) | y |
45+
| main.go:112:29:112:35 | (SSA def(wrapper)) | wrapper |
46+
| main.go:112:29:112:35 | (SSA def(wrapper)).s | wrapper.s |
47+
| main.go:113:2:113:2 | (SSA def(x)) | x |
48+
| main.go:114:2:117:3 | (SSA def(x)) | x |
49+
| main.go:114:16:117:2 | (SSA def(x)) | x |
50+
| main.go:115:3:115:3 | (SSA def(y)) | y |
51+
| main.go:116:3:116:3 | (SSA def(x)) | x |
52+
| main.go:130:3:130:3 | (SSA def(p)) | p |
53+
| main.go:132:3:132:3 | (SSA def(p)) | p |
54+
| main.go:135:2:135:2 | (SSA phi(p)) | p |
55+
| main.go:135:2:135:2 | (SSA phi(p)).a | p.a |
56+
| main.go:135:2:135:2 | (SSA phi(p)).b | p.b |
57+
| main.go:135:2:135:2 | (SSA phi(p)).b.a | p.b.a |
58+
| main.go:135:2:135:2 | (SSA phi(p)).c | p.c |
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
#select
22
| server/main.go:30:38:30:48 | selection of Text | rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | server/main.go:30:38:30:48 | selection of Text | The $@ of this request depends on a $@. | server/main.go:30:38:30:48 | selection of Text | URL | rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | user-provided value |
3-
| server/main.go:30:38:30:48 | selection of Text | server/main.go:19:56:19:61 | definition of params | server/main.go:30:38:30:48 | selection of Text | The $@ of this request depends on a $@. | server/main.go:30:38:30:48 | selection of Text | URL | server/main.go:19:56:19:61 | definition of params | user-provided value |
3+
| server/main.go:30:38:30:48 | selection of Text | server/main.go:19:56:19:61 | SSA def(params) | server/main.go:30:38:30:48 | selection of Text | The $@ of this request depends on a $@. | server/main.go:30:38:30:48 | selection of Text | URL | server/main.go:19:56:19:61 | SSA def(params) | user-provided value |
44
edges
5-
| client/main.go:16:35:16:78 | &... | server/main.go:19:56:19:61 | definition of params | provenance | |
5+
| client/main.go:16:35:16:78 | &... | server/main.go:19:56:19:61 | SSA def(params) | provenance | |
66
| client/main.go:16:35:16:78 | &... [postupdate] | client/main.go:16:35:16:78 | &... | provenance | |
77
| rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | rpc/notes/service.twirp.go:544:27:544:29 | buf | provenance | |
88
| rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | rpc/notes/service.twirp.go:538:2:538:33 | ... := ...[0] | provenance | Src:MaD:1 MaD:3 |
99
| rpc/notes/service.twirp.go:544:27:544:29 | buf | rpc/notes/service.twirp.go:544:32:544:41 | reqContent [postupdate] | provenance | MaD:2 |
10-
| rpc/notes/service.twirp.go:544:32:544:41 | reqContent [postupdate] | rpc/notes/service.twirp.go:574:2:577:2 | capture variable reqContent | provenance | |
11-
| rpc/notes/service.twirp.go:574:2:577:2 | capture variable reqContent | rpc/notes/service.twirp.go:576:35:576:44 | reqContent | provenance | |
12-
| rpc/notes/service.twirp.go:576:35:576:44 | reqContent | server/main.go:19:56:19:61 | definition of params | provenance | |
13-
| server/main.go:19:56:19:61 | definition of params | server/main.go:19:56:19:61 | definition of params [Return] | provenance | |
14-
| server/main.go:19:56:19:61 | definition of params | server/main.go:30:38:30:48 | selection of Text | provenance | |
15-
| server/main.go:19:56:19:61 | definition of params | server/main.go:30:38:30:48 | selection of Text | provenance | |
16-
| server/main.go:19:56:19:61 | definition of params [Return] | client/main.go:16:35:16:78 | &... [postupdate] | provenance | |
10+
| rpc/notes/service.twirp.go:544:32:544:41 | reqContent [postupdate] | rpc/notes/service.twirp.go:574:2:577:2 | SSA def(reqContent) | provenance | |
11+
| rpc/notes/service.twirp.go:574:2:577:2 | SSA def(reqContent) | rpc/notes/service.twirp.go:576:35:576:44 | reqContent | provenance | |
12+
| rpc/notes/service.twirp.go:576:35:576:44 | reqContent | server/main.go:19:56:19:61 | SSA def(params) | provenance | |
13+
| server/main.go:19:56:19:61 | SSA def(params) | server/main.go:19:56:19:61 | SSA def(params) [Return] | provenance | |
14+
| server/main.go:19:56:19:61 | SSA def(params) | server/main.go:30:38:30:48 | selection of Text | provenance | |
15+
| server/main.go:19:56:19:61 | SSA def(params) | server/main.go:30:38:30:48 | selection of Text | provenance | |
16+
| server/main.go:19:56:19:61 | SSA def(params) [Return] | client/main.go:16:35:16:78 | &... [postupdate] | provenance | |
1717
models
1818
| 1 | Source: net/http; Request; true; Body; ; ; ; remote; manual |
1919
| 2 | Summary: google.golang.org/protobuf/proto; ; false; Unmarshal; ; ; Argument[0]; Argument[1]; taint; manual |
@@ -25,10 +25,10 @@ nodes
2525
| rpc/notes/service.twirp.go:538:25:538:32 | selection of Body | semmle.label | selection of Body |
2626
| rpc/notes/service.twirp.go:544:27:544:29 | buf | semmle.label | buf |
2727
| rpc/notes/service.twirp.go:544:32:544:41 | reqContent [postupdate] | semmle.label | reqContent [postupdate] |
28-
| rpc/notes/service.twirp.go:574:2:577:2 | capture variable reqContent | semmle.label | capture variable reqContent |
28+
| rpc/notes/service.twirp.go:574:2:577:2 | SSA def(reqContent) | semmle.label | SSA def(reqContent) |
2929
| rpc/notes/service.twirp.go:576:35:576:44 | reqContent | semmle.label | reqContent |
30-
| server/main.go:19:56:19:61 | definition of params | semmle.label | definition of params |
31-
| server/main.go:19:56:19:61 | definition of params | semmle.label | definition of params |
32-
| server/main.go:19:56:19:61 | definition of params [Return] | semmle.label | definition of params [Return] |
30+
| server/main.go:19:56:19:61 | SSA def(params) | semmle.label | SSA def(params) |
31+
| server/main.go:19:56:19:61 | SSA def(params) | semmle.label | SSA def(params) |
32+
| server/main.go:19:56:19:61 | SSA def(params) [Return] | semmle.label | SSA def(params) [Return] |
3333
| server/main.go:30:38:30:48 | selection of Text | semmle.label | selection of Text |
3434
subpaths

0 commit comments

Comments
 (0)