Skip to content

Commit d75a521

Browse files
committed
Support more CFG node types in optional binding flow
1 parent 4a89a30 commit d75a521

File tree

2 files changed

+23
-25
lines changed

2 files changed

+23
-25
lines changed

swift/ql/lib/codeql/swift/controlflow/CfgNodes.qll

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -91,20 +91,21 @@ class CfgNode extends ControlFlowNode, TElementNode {
9191

9292
/** Gets a split for this control flow node, if any. */
9393
final Split getASplit() { result = splits.getASplit() }
94-
}
9594

96-
private Expr getAst(ControlFlowElement n) {
97-
result = n.asAstNode()
98-
or
99-
result = n.(PropertyGetterElement).getRef()
100-
or
101-
result = n.(PropertySetterElement).getAssignExpr()
102-
or
103-
result = n.(PropertyObserverElement).getAssignExpr()
104-
or
105-
result = n.(ClosureElement).getAst()
106-
or
107-
result = n.(KeyPathElement).getAst()
95+
/** Gets the AST representation of this control flow node, if any. */
96+
Expr getAst() {
97+
result = n.asAstNode()
98+
or
99+
result = n.(PropertyGetterElement).getRef()
100+
or
101+
result = n.(PropertySetterElement).getAssignExpr()
102+
or
103+
result = n.(PropertyObserverElement).getAssignExpr()
104+
or
105+
result = n.(ClosureElement).getAst()
106+
or
107+
result = n.(KeyPathElement).getAst()
108+
}
108109
}
109110

110111
/** A control-flow node that wraps an AST expression. */
@@ -123,7 +124,7 @@ class PropertyGetterCfgNode extends CfgNode {
123124

124125
Expr getRef() { result = n.getRef() }
125126

126-
CfgNode getBase() { getAst(result.getNode()) = n.getBase() }
127+
CfgNode getBase() { result.getAst() = n.getBase() }
127128

128129
AccessorDecl getAccessorDecl() { result = n.getAccessorDecl() }
129130
}
@@ -134,9 +135,9 @@ class PropertySetterCfgNode extends CfgNode {
134135

135136
AssignExpr getAssignExpr() { result = n.getAssignExpr() }
136137

137-
CfgNode getBase() { getAst(result.getNode()) = n.getBase() }
138+
CfgNode getBase() { result.getAst() = n.getBase() }
138139

139-
CfgNode getSource() { getAst(result.getNode()) = n.getAssignExpr().getSource() }
140+
CfgNode getSource() { result.getAst() = n.getAssignExpr().getSource() }
140141

141142
AccessorDecl getAccessorDecl() { result = n.getAccessorDecl() }
142143
}
@@ -146,19 +147,19 @@ class PropertyObserverCfgNode extends CfgNode {
146147

147148
AssignExpr getAssignExpr() { result = n.getAssignExpr() }
148149

149-
CfgNode getBase() { getAst(result.getNode()) = n.getBase() }
150+
CfgNode getBase() { result.getAst() = n.getBase() }
150151

151-
CfgNode getSource() { getAst(result.getNode()) = n.getAssignExpr().getSource() }
152+
CfgNode getSource() { result.getAst() = n.getAssignExpr().getSource() }
152153

153154
AccessorDecl getAccessorDecl() { result = n.getObserver() }
154155
}
155156

156157
class ApplyExprCfgNode extends ExprCfgNode {
157158
override ApplyExpr e;
158159

159-
CfgNode getArgument(int index) { getAst(result.getNode()) = e.getArgument(index).getExpr() }
160+
CfgNode getArgument(int index) { result.getAst() = e.getArgument(index).getExpr() }
160161

161-
CfgNode getQualifier() { getAst(result.getNode()) = e.getQualifier() }
162+
CfgNode getQualifier() { result.getAst() = e.getQualifier() }
162163

163164
AbstractFunctionDecl getStaticTarget() { result = e.getStaticTarget() }
164165

swift/ql/lib/codeql/swift/dataflow/Ssa.qll

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,7 @@ module Ssa {
160160
pbd.getAPattern() = bb.getNode(blockIndex).getNode().asAstNode() and
161161
init = var.getParentInitializer()
162162
|
163-
value.getNode().asAstNode() = init
164-
or
165-
// TODO: We should probably enumerate more cfg nodes here.
166-
value.(PropertyGetterCfgNode).getRef() = init
163+
value.getAst() = init
167164
)
168165
or
169166
exists(SsaInput::BasicBlock bb, int blockIndex, ConditionElement ce, Expr init |
@@ -172,7 +169,7 @@ module Ssa {
172169
init = ce.getInitializer() and
173170
strictcount(Ssa::WriteDefinition alt | alt.definesAt(_, bb, blockIndex)) = 1 // exclude cases where there are multiple writes from the same pattern, this is at best taint flow.
174171
|
175-
value.getNode().asAstNode() = init
172+
value.getAst() = init
176173
)
177174
}
178175
}

0 commit comments

Comments
 (0)