Skip to content

Commit b609f1e

Browse files
authored
Merge pull request #9668 from MathiasVP/expr-nodes-for-properties
Swift: Make sure property setters and getters also have `ExprNodes`
2 parents 5432be7 + 77b8ceb commit b609f1e

File tree

4 files changed

+37
-14
lines changed

4 files changed

+37
-14
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,15 @@ private module JoinBlockPredecessors {
214214
}
215215

216216
int getId(JoinBlockPredecessor jbp) {
217-
idOf(projctToAst(jbp.getFirstNode().(AstCfgNode).getNode()), result)
217+
idOf(projctToAst(jbp.getFirstNode().(CfgNode).getNode()), result)
218218
or
219219
idOf(jbp.(EntryBasicBlock).getScope(), result)
220220
}
221221

222222
string getSplitString(JoinBlockPredecessor jbp) {
223-
result = jbp.getFirstNode().(AstCfgNode).getSplitsString()
223+
result = jbp.getFirstNode().(CfgNode).getSplitsString()
224224
or
225-
not exists(jbp.getFirstNode().(AstCfgNode).getSplitsString()) and
225+
not exists(jbp.getFirstNode().(CfgNode).getSplitsString()) and
226226
result = ""
227227
}
228228
}

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

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ class ExitNode extends ControlFlowNode, TExitNode {
6161
/**
6262
* A node for an AST node.
6363
*
64-
* Each AST node maps to zero or more `AstCfgNode`s: zero when the node is unreachable
64+
* Each AST node maps to zero or more `CfgNode`s: zero when the node is unreachable
6565
* (dead) code or not important for control flow, and multiple when there are different
6666
* splits for the AST node.
6767
*/
68-
class AstCfgNode extends ControlFlowNode, TElementNode {
68+
class CfgNode extends ControlFlowNode, TElementNode {
6969
private Splits splits;
70-
private ControlFlowElement n;
70+
ControlFlowElement n;
7171

72-
AstCfgNode() { this = TElementNode(_, n, splits) }
72+
CfgNode() { this = TElementNode(_, n, splits) }
7373

7474
final override ControlFlowElement getNode() { result = n }
7575

@@ -94,7 +94,7 @@ class AstCfgNode extends ControlFlowNode, TElementNode {
9494
}
9595

9696
/** A control-flow node that wraps an AST expression. */
97-
class ExprCfgNode extends AstCfgNode {
97+
class ExprCfgNode extends CfgNode {
9898
Expr e;
9999

100100
ExprCfgNode() { e = this.getNode().asAstNode() }
@@ -103,6 +103,20 @@ class ExprCfgNode extends AstCfgNode {
103103
Expr getExpr() { result = e }
104104
}
105105

106+
/** A control-flow node that wraps a property getter. */
107+
class PropertyGetterCfgNode extends CfgNode {
108+
override PropertyGetterElement n;
109+
110+
Expr getRef() { result = n.getRef() }
111+
}
112+
113+
/** A control-flow node that wraps a property setter. */
114+
class PropertySetterCfgNode extends CfgNode {
115+
override PropertySetterElement n;
116+
117+
AssignExpr getAssignExpr() { result = n.getAssignExpr() }
118+
}
119+
106120
class ApplyExprCfgNode extends ExprCfgNode {
107121
override ApplyExpr e;
108122

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private class ExprNodeImpl extends ExprNode, NodeImpl {
3737

3838
override string toStringImpl() { result = expr.toString() }
3939

40-
override DataFlowCallable getEnclosingCallable() { result = TDataFlowFunc(expr.getScope()) }
40+
override DataFlowCallable getEnclosingCallable() { result = TDataFlowFunc(n.getScope()) }
4141
}
4242

4343
private class SsaDefinitionNodeImpl extends SsaDefinitionNode, NodeImpl {
@@ -62,7 +62,7 @@ cached
6262
private module Cached {
6363
cached
6464
newtype TNode =
65-
TExprNode(ExprCfgNode e) or
65+
TExprNode(CfgNode n, Expr e) { hasExprNode(n, e) } or
6666
TSsaDefinitionNode(Ssa::Definition def) or
6767
TInoutReturnNode(ParamDecl param) { param.isInout() } or
6868
TInOutUpdateNode(ParamDecl param, CallExpr call) {
@@ -71,6 +71,14 @@ private module Cached {
7171
} or
7272
TSummaryNode(FlowSummary::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNodeState state)
7373

74+
private predicate hasExprNode(CfgNode n, Expr e) {
75+
n.(ExprCfgNode).getExpr() = e
76+
or
77+
n.(PropertyGetterCfgNode).getRef() = e
78+
or
79+
n.(PropertySetterCfgNode).getAssignExpr() = e
80+
}
81+
7482
private predicate localSsaFlowStepUseUse(Ssa::Definition def, Node nodeFrom, Node nodeTo) {
7583
def.adjacentReadPair(nodeFrom.getCfgNode(), nodeTo.getCfgNode()) and
7684
(

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,14 @@ class Node extends TNode {
5656
* `ControlFlow::Node`s.
5757
*/
5858
class ExprNode extends Node, TExprNode {
59-
ExprCfgNode expr;
59+
CfgNode n;
60+
Expr expr;
6061

61-
ExprNode() { this = TExprNode(expr) }
62+
ExprNode() { this = TExprNode(n, expr) }
6263

63-
override Expr asExpr() { result = expr.getNode().asAstNode() }
64+
override Expr asExpr() { result = expr }
6465

65-
override ControlFlowNode getCfgNode() { result = expr }
66+
override ControlFlowNode getCfgNode() { result = n }
6667
}
6768

6869
/**

0 commit comments

Comments
 (0)