Skip to content

Commit 0b6ea70

Browse files
committed
Swift: Create explicit parameter nodes for source parameters and MaD parameters.
1 parent bba70a7 commit 0b6ea70

File tree

3 files changed

+123
-35
lines changed

3 files changed

+123
-35
lines changed

swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPrivate.qll

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,13 @@ private module Cached {
6464
TExprNode(CfgNode n, Expr e) { hasExprNode(n, e) } or
6565
TSsaDefinitionNode(Ssa::Definition def) or
6666
TInoutReturnNode(ParamDecl param) { modifiableParam(param) } or
67-
TSummaryNode(FlowSummary::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNodeState state) or
67+
TSummaryNode(FlowSummary::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNodeState state) {
68+
FlowSummaryImpl::Private::summaryNodeRange(c, state)
69+
} or
70+
TSourceParameterNode(ParamDecl param) or
71+
TSummaryParameterNode(FlowSummary::SummarizedCallable c, ParameterPosition pos) {
72+
FlowSummaryImpl::Private::summaryParameterNodeRange(c, pos)
73+
} or
6874
TExprPostUpdateNode(CfgNode n) {
6975
// Obviously, the base of setters needs a post-update node
7076
n = any(PropertySetterCfgNode setter).getBase()
@@ -93,6 +99,20 @@ private module Cached {
9399
)
94100
}
95101

102+
private SsaDefinitionNode getParameterDefNode(ParamDecl p) {
103+
exists(BasicBlock bb, int i |
104+
bb.getNode(i).getNode().asAstNode() = p and
105+
result.asDefinition().definesAt(_, bb, i)
106+
)
107+
}
108+
109+
/**
110+
* Holds if `nodeFrom` is a parameter node, and `nodeTo` is a corresponding SSA node.
111+
*/
112+
private predicate localFlowSsaParamInput(Node nodeFrom, Node nodeTo) {
113+
nodeTo = getParameterDefNode(nodeFrom.(ParameterNode).getParameter())
114+
}
115+
96116
private predicate localFlowStepCommon(Node nodeFrom, Node nodeTo) {
97117
exists(Ssa::Definition def |
98118
// Step from assignment RHS to def
@@ -117,6 +137,8 @@ private module Cached {
117137
localFlowSsaInput(nodeFrom, def, nodeTo.asDefinition())
118138
)
119139
or
140+
localFlowSsaParamInput(nodeFrom, nodeTo)
141+
or
120142
// flow through `&` (inout argument)
121143
nodeFrom.asExpr() = nodeTo.asExpr().(InOutExpr).getSubExpr()
122144
or
@@ -181,17 +203,15 @@ predicate nodeIsHidden(Node n) { none() }
181203
private module ParameterNodes {
182204
abstract class ParameterNodeImpl extends NodeImpl {
183205
predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) { none() }
206+
207+
/** Gets the parameter associated with this node, if any. */
208+
ParamDecl getParameter() { none() }
184209
}
185210

186-
class NormalParameterNode extends ParameterNodeImpl, SsaDefinitionNodeImpl {
211+
class SourceParameterNode extends ParameterNodeImpl, TSourceParameterNode {
187212
ParamDecl param;
188213

189-
NormalParameterNode() {
190-
exists(BasicBlock bb, int i |
191-
super.asDefinition().definesAt(param, bb, i) and
192-
bb.getNode(i).getNode().asAstNode() = param
193-
)
194-
}
214+
SourceParameterNode() { this = TSourceParameterNode(param) }
195215

196216
override Location getLocationImpl() { result = param.getLocation() }
197217

@@ -206,6 +226,26 @@ private module ParameterNodes {
206226
}
207227

208228
override DataFlowCallable getEnclosingCallable() { this.isParameterOf(result, _) }
229+
230+
override ParamDecl getParameter() { result = param }
231+
}
232+
233+
class SummaryParameterNode extends ParameterNodeImpl, TSummaryParameterNode {
234+
FlowSummary::SummarizedCallable sc;
235+
ParameterPosition pos;
236+
237+
SummaryParameterNode() { this = TSummaryParameterNode(sc, pos) }
238+
239+
override predicate isParameterOf(DataFlowCallable c, ParameterPosition p) {
240+
c.getUnderlyingCallable() = sc and
241+
p = pos
242+
}
243+
244+
override Location getLocationImpl() { result = sc.getLocation() }
245+
246+
override string toStringImpl() { result = "[summary param] " + pos + " in " + sc }
247+
248+
override DataFlowCallable getEnclosingCallable() { this.isParameterOf(result, _) }
209249
}
210250
}
211251

swift/ql/lib/codeql/swift/dataflow/internal/DataFlowPublic.qll

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,15 @@ class ExprNode extends Node, TExprNode {
7070
* The value of a parameter at function entry, viewed as a node in a data
7171
* flow graph.
7272
*/
73-
class ParameterNode extends Node, SsaDefinitionNode instanceof ParameterNodeImpl { }
73+
class ParameterNode extends Node instanceof ParameterNodeImpl {
74+
override ControlFlowNode getCfgNode() { result = this.(ParameterNodeImpl).getCfgNode() }
75+
76+
DataFlowCallable getDeclaringFunction() {
77+
result = this.(ParameterNodeImpl).getEnclosingCallable()
78+
}
79+
80+
ParamDecl getParameter() { result = this.(ParameterNodeImpl).getParameter() }
81+
}
7482

7583
/**
7684
*/

swift/ql/test/library-tests/dataflow/dataflow/LocalFlow.expected

Lines changed: 66 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@
1010
| test.swift:15:5:15:5 | Phi | test.swift:15:15:15:15 | t2 |
1111
| test.swift:17:5:17:10 | WriteDef | test.swift:21:15:21:15 | t1 |
1212
| test.swift:17:10:17:10 | 0 | test.swift:17:5:17:10 | WriteDef |
13-
| test.swift:29:18:29:21 | x | test.swift:30:15:30:15 | x |
14-
| test.swift:29:26:29:29 | y | test.swift:31:15:31:15 | y |
15-
| test.swift:42:16:42:19 | b | test.swift:45:8:45:8 | b |
13+
| test.swift:29:18:29:21 | WriteDef | test.swift:30:15:30:15 | x |
14+
| test.swift:29:18:29:21 | x | test.swift:29:18:29:21 | WriteDef |
15+
| test.swift:29:26:29:29 | WriteDef | test.swift:31:15:31:15 | y |
16+
| test.swift:29:26:29:29 | y | test.swift:29:26:29:29 | WriteDef |
17+
| test.swift:42:16:42:19 | WriteDef | test.swift:45:8:45:8 | b |
18+
| test.swift:42:16:42:19 | b | test.swift:42:16:42:19 | WriteDef |
1619
| test.swift:43:9:43:13 | WriteDef | test.swift:46:13:46:13 | t1 |
1720
| test.swift:43:19:43:26 | call to source() | test.swift:43:9:43:13 | WriteDef |
1821
| test.swift:46:9:46:13 | WriteDef | test.swift:50:5:50:5 | Phi |
@@ -28,8 +31,10 @@
2831
| test.swift:61:22:61:23 | &... | test.swift:62:15:62:15 | x |
2932
| test.swift:61:22:61:23 | [post] &... | test.swift:62:15:62:15 | x |
3033
| test.swift:61:23:61:23 | x | test.swift:61:22:61:23 | &... |
31-
| test.swift:65:16:65:28 | arg1 | test.swift:66:21:66:21 | arg1 |
32-
| test.swift:65:33:65:45 | arg2 | test.swift:67:12:67:12 | arg2 |
34+
| test.swift:65:16:65:28 | WriteDef | test.swift:66:21:66:21 | arg1 |
35+
| test.swift:65:16:65:28 | arg1 | test.swift:65:16:65:28 | WriteDef |
36+
| test.swift:65:33:65:45 | WriteDef | test.swift:67:12:67:12 | arg2 |
37+
| test.swift:65:33:65:45 | arg2 | test.swift:65:33:65:45 | WriteDef |
3338
| test.swift:66:9:66:15 | WriteDef | test.swift:68:12:68:12 | temp |
3439
| test.swift:66:21:66:21 | arg1 | test.swift:66:9:66:15 | WriteDef |
3540
| test.swift:67:5:67:12 | WriteDef | test.swift:65:1:70:1 | arg1[return] |
@@ -49,12 +54,14 @@
4954
| test.swift:81:5:81:18 | WriteDef | test.swift:80:1:82:1 | arg[return] |
5055
| test.swift:81:11:81:18 | call to source() | test.swift:81:5:81:18 | WriteDef |
5156
| test.swift:84:1:91:1 | Phi | test.swift:84:1:91:1 | arg[return] |
52-
| test.swift:84:48:84:54 | bool | test.swift:85:8:85:8 | bool |
57+
| test.swift:84:48:84:54 | WriteDef | test.swift:85:8:85:8 | bool |
58+
| test.swift:84:48:84:54 | bool | test.swift:84:48:84:54 | WriteDef |
5359
| test.swift:86:9:86:22 | WriteDef | test.swift:84:1:91:1 | Phi |
5460
| test.swift:86:15:86:22 | call to source() | test.swift:86:9:86:22 | WriteDef |
5561
| test.swift:89:9:89:22 | WriteDef | test.swift:84:1:91:1 | Phi |
5662
| test.swift:89:15:89:22 | call to source() | test.swift:89:9:89:22 | WriteDef |
57-
| test.swift:93:17:93:23 | bool | test.swift:104:50:104:50 | bool |
63+
| test.swift:93:17:93:23 | WriteDef | test.swift:104:50:104:50 | bool |
64+
| test.swift:93:17:93:23 | bool | test.swift:93:17:93:23 | WriteDef |
5865
| test.swift:95:13:95:16 | WriteDef | test.swift:96:19:96:19 | x |
5966
| test.swift:95:22:95:22 | 0 | test.swift:95:13:95:16 | WriteDef |
6067
| test.swift:96:19:96:19 | x | test.swift:97:40:97:40 | x |
@@ -67,45 +74,66 @@
6774
| test.swift:104:40:104:41 | &... | test.swift:105:19:105:19 | x |
6875
| test.swift:104:40:104:41 | [post] &... | test.swift:105:19:105:19 | x |
6976
| test.swift:104:41:104:41 | x | test.swift:104:40:104:41 | &... |
70-
| test.swift:109:9:109:14 | arg | test.swift:110:12:110:12 | arg |
71-
| test.swift:113:14:113:19 | arg | test.swift:114:19:114:19 | arg |
72-
| test.swift:113:24:113:41 | lambda | test.swift:114:12:114:12 | lambda |
77+
| test.swift:109:9:109:14 | WriteDef | test.swift:110:12:110:12 | arg |
78+
| test.swift:109:9:109:14 | arg | test.swift:109:9:109:14 | WriteDef |
79+
| test.swift:113:14:113:19 | WriteDef | test.swift:114:19:114:19 | arg |
80+
| test.swift:113:14:113:19 | arg | test.swift:113:14:113:19 | WriteDef |
81+
| test.swift:113:24:113:41 | WriteDef | test.swift:114:12:114:12 | lambda |
82+
| test.swift:113:24:113:41 | lambda | test.swift:113:24:113:41 | WriteDef |
7383
| test.swift:118:9:118:12 | WriteDef | test.swift:119:31:119:31 | x |
7484
| test.swift:118:18:118:25 | call to source() | test.swift:118:9:118:12 | WriteDef |
7585
| test.swift:119:9:119:12 | WriteDef | test.swift:120:15:120:15 | y |
7686
| test.swift:119:18:119:44 | call to forward(arg:lambda:) | test.swift:119:9:119:12 | WriteDef |
7787
| test.swift:122:9:122:12 | WriteDef | test.swift:126:15:126:15 | z |
7888
| test.swift:122:18:125:6 | call to forward(arg:lambda:) | test.swift:122:9:122:12 | WriteDef |
79-
| test.swift:123:10:123:13 | i | test.swift:124:16:124:16 | i |
89+
| test.swift:123:10:123:13 | WriteDef | test.swift:124:16:124:16 | i |
90+
| test.swift:123:10:123:13 | i | test.swift:123:10:123:13 | WriteDef |
8091
| test.swift:128:9:128:16 | WriteDef | test.swift:132:15:132:15 | clean |
8192
| test.swift:128:22:131:6 | call to forward(arg:lambda:) | test.swift:128:9:128:16 | WriteDef |
8293
| test.swift:141:9:141:9 | WriteDef | test.swift:145:15:145:15 | lambda2 |
8394
| test.swift:141:19:144:5 | { ... } | test.swift:141:9:141:9 | WriteDef |
84-
| test.swift:142:10:142:13 | i | test.swift:143:16:143:16 | i |
95+
| test.swift:142:10:142:13 | WriteDef | test.swift:143:16:143:16 | i |
96+
| test.swift:142:10:142:13 | i | test.swift:142:10:142:13 | WriteDef |
8597
| test.swift:147:9:147:9 | WriteDef | test.swift:151:15:151:15 | lambdaSource |
8698
| test.swift:147:24:150:5 | { ... } | test.swift:147:9:147:9 | WriteDef |
8799
| test.swift:151:15:151:15 | lambdaSource | test.swift:159:16:159:16 | lambdaSource |
88100
| test.swift:153:9:153:9 | WriteDef | test.swift:157:5:157:5 | lambdaSink |
89101
| test.swift:153:22:156:5 | { ... } | test.swift:153:9:153:9 | WriteDef |
90-
| test.swift:154:10:154:13 | i | test.swift:155:19:155:19 | i |
102+
| test.swift:154:10:154:13 | WriteDef | test.swift:155:19:155:19 | i |
103+
| test.swift:154:10:154:13 | i | test.swift:154:10:154:13 | WriteDef |
91104
| test.swift:157:5:157:5 | lambdaSink | test.swift:159:5:159:5 | lambdaSink |
92-
| test.swift:162:7:162:7 | self | test.swift:162:7:162:7 | self[return] |
93-
| test.swift:165:3:165:3 | self | test.swift:166:5:166:5 | self |
105+
| test.swift:162:7:162:7 | WriteDef | test.swift:162:7:162:7 | self[return] |
106+
| test.swift:162:7:162:7 | self | test.swift:162:7:162:7 | WriteDef |
107+
| test.swift:163:7:163:7 | self | test.swift:163:7:163:7 | WriteDef |
108+
| test.swift:163:7:163:7 | self | test.swift:163:7:163:7 | WriteDef |
109+
| test.swift:163:7:163:7 | self | test.swift:163:7:163:7 | WriteDef |
110+
| test.swift:163:7:163:7 | value | test.swift:163:7:163:7 | WriteDef |
111+
| test.swift:165:3:165:3 | WriteDef | test.swift:166:5:166:5 | self |
112+
| test.swift:165:3:165:3 | self | test.swift:165:3:165:3 | WriteDef |
94113
| test.swift:166:5:166:5 | [post] self | test.swift:165:3:167:3 | self[return] |
95114
| test.swift:166:5:166:5 | self | test.swift:165:3:167:3 | self[return] |
96-
| test.swift:169:8:169:8 | self | test.swift:170:5:170:5 | self |
97-
| test.swift:169:12:169:22 | value | test.swift:170:9:170:9 | value |
115+
| test.swift:169:8:169:8 | WriteDef | test.swift:170:5:170:5 | self |
116+
| test.swift:169:8:169:8 | self | test.swift:169:8:169:8 | WriteDef |
117+
| test.swift:169:12:169:22 | WriteDef | test.swift:170:9:170:9 | value |
118+
| test.swift:169:12:169:22 | value | test.swift:169:12:169:22 | WriteDef |
98119
| test.swift:170:5:170:5 | [post] self | test.swift:169:3:171:3 | self[return] |
99120
| test.swift:170:5:170:5 | self | test.swift:169:3:171:3 | self[return] |
100-
| test.swift:173:8:173:8 | self | test.swift:174:12:174:12 | self |
121+
| test.swift:173:8:173:8 | WriteDef | test.swift:174:12:174:12 | self |
122+
| test.swift:173:8:173:8 | self | test.swift:173:8:173:8 | WriteDef |
101123
| test.swift:174:12:174:12 | [post] self | test.swift:173:3:175:3 | self[return] |
102124
| test.swift:174:12:174:12 | self | test.swift:173:3:175:3 | self[return] |
103125
| test.swift:179:7:179:7 | WriteDef | test.swift:180:3:180:3 | a |
104126
| test.swift:179:11:179:13 | call to init() | test.swift:179:7:179:7 | WriteDef |
105127
| test.swift:180:3:180:3 | [post] a | test.swift:181:13:181:13 | a |
106128
| test.swift:180:3:180:3 | a | test.swift:181:13:181:13 | a |
107-
| test.swift:184:7:184:7 | self | test.swift:184:7:184:7 | self[return] |
108-
| test.swift:187:3:187:3 | self | test.swift:188:5:188:5 | self |
129+
| test.swift:184:7:184:7 | WriteDef | test.swift:184:7:184:7 | self[return] |
130+
| test.swift:184:7:184:7 | self | test.swift:184:7:184:7 | WriteDef |
131+
| test.swift:185:7:185:7 | self | test.swift:185:7:185:7 | WriteDef |
132+
| test.swift:185:7:185:7 | self | test.swift:185:7:185:7 | WriteDef |
133+
| test.swift:185:7:185:7 | self | test.swift:185:7:185:7 | WriteDef |
134+
| test.swift:185:7:185:7 | value | test.swift:185:7:185:7 | WriteDef |
135+
| test.swift:187:3:187:3 | WriteDef | test.swift:188:5:188:5 | self |
136+
| test.swift:187:3:187:3 | self | test.swift:187:3:187:3 | WriteDef |
109137
| test.swift:188:5:188:5 | [post] self | test.swift:187:3:189:3 | self[return] |
110138
| test.swift:188:5:188:5 | self | test.swift:187:3:189:3 | self[return] |
111139
| test.swift:193:7:193:7 | WriteDef | test.swift:194:3:194:3 | b |
@@ -128,19 +156,31 @@
128156
| test.swift:217:11:217:13 | call to init() | test.swift:217:7:217:7 | WriteDef |
129157
| test.swift:218:3:218:3 | [post] b | test.swift:219:13:219:13 | b |
130158
| test.swift:218:3:218:3 | b | test.swift:219:13:219:13 | b |
131-
| test.swift:222:7:222:7 | self | test.swift:222:7:222:7 | self[return] |
132-
| test.swift:222:7:222:7 | self | test.swift:222:7:222:7 | self[return] |
133-
| test.swift:224:5:224:5 | self | test.swift:224:5:226:5 | self[return] |
134-
| test.swift:227:5:227:5 | self | test.swift:227:5:229:5 | self[return] |
159+
| test.swift:222:7:222:7 | WriteDef | test.swift:222:7:222:7 | self[return] |
160+
| test.swift:222:7:222:7 | WriteDef | test.swift:222:7:222:7 | self[return] |
161+
| test.swift:222:7:222:7 | self | test.swift:222:7:222:7 | WriteDef |
162+
| test.swift:222:7:222:7 | self | test.swift:222:7:222:7 | WriteDef |
163+
| test.swift:223:7:223:7 | self | test.swift:223:7:223:7 | WriteDef |
164+
| test.swift:224:5:224:5 | WriteDef | test.swift:224:5:226:5 | self[return] |
165+
| test.swift:224:5:224:5 | self | test.swift:224:5:224:5 | WriteDef |
166+
| test.swift:227:5:227:5 | WriteDef | test.swift:227:5:229:5 | self[return] |
167+
| test.swift:227:5:227:5 | self | test.swift:227:5:227:5 | WriteDef |
135168
| test.swift:234:7:234:7 | WriteDef | test.swift:235:13:235:13 | a |
136169
| test.swift:234:11:234:31 | call to init() | test.swift:234:7:234:7 | WriteDef |
137170
| test.swift:235:13:235:13 | [post] a | test.swift:237:3:237:3 | a |
138171
| test.swift:235:13:235:13 | a | test.swift:237:3:237:3 | a |
139172
| test.swift:237:3:237:3 | [post] a | test.swift:238:13:238:13 | a |
140173
| test.swift:237:3:237:3 | a | test.swift:238:13:238:13 | a |
141-
| test.swift:243:9:243:9 | self | test.swift:243:18:243:18 | self |
174+
| test.swift:242:9:242:9 | self | test.swift:242:9:242:9 | WriteDef |
175+
| test.swift:242:9:242:9 | self | test.swift:242:9:242:9 | WriteDef |
176+
| test.swift:242:9:242:9 | self | test.swift:242:9:242:9 | WriteDef |
177+
| test.swift:242:9:242:9 | value | test.swift:242:9:242:9 | WriteDef |
178+
| test.swift:243:9:243:9 | WriteDef | test.swift:243:18:243:18 | self |
179+
| test.swift:243:9:243:9 | self | test.swift:243:9:243:9 | WriteDef |
142180
| test.swift:243:18:243:18 | [post] self | test.swift:243:9:243:42 | self[return] |
143181
| test.swift:243:18:243:18 | self | test.swift:243:9:243:42 | self[return] |
144-
| test.swift:246:5:246:5 | self | test.swift:247:9:247:9 | self |
182+
| test.swift:246:5:246:5 | WriteDef | test.swift:247:9:247:9 | self |
183+
| test.swift:246:5:246:5 | self | test.swift:246:5:246:5 | WriteDef |
145184
| test.swift:247:9:247:9 | [post] self | test.swift:246:5:248:5 | self[return] |
146185
| test.swift:247:9:247:9 | self | test.swift:246:5:248:5 | self[return] |
186+
| test.swift:252:23:252:23 | value | test.swift:252:23:252:23 | WriteDef |

0 commit comments

Comments
 (0)