Skip to content

Commit d86983b

Browse files
committed
Ruby: use InstanceVariableRead/WriteAccess CFG nodes
1 parent 5fa4f07 commit d86983b

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ module ExprNodes {
623623
class InstanceVariableAccessCfgNode extends ExprCfgNode {
624624
override InstanceVariableAccessMapping e;
625625

626-
final override InstanceVariableAccess getExpr() { result = ExprCfgNode.super.getExpr() }
626+
override InstanceVariableAccess getExpr() { result = ExprCfgNode.super.getExpr() }
627627

628628
/**
629629
* Gets the synthetic receiver(`self`) of this instance variable access.
@@ -652,11 +652,22 @@ module ExprNodes {
652652
final override ConstantWriteAccess getExpr() { result = ExprCfgNode.super.getExpr() }
653653
}
654654

655+
/** A control-flow node that wraps an `InstanceVariableReadAccess` AST expression. */
656+
class InstanceVariableReadAccessCfgNode extends InstanceVariableAccessCfgNode {
657+
InstanceVariableReadAccessCfgNode() { this.getNode() instanceof InstanceVariableReadAccess }
658+
659+
final override InstanceVariableReadAccess getExpr() {
660+
result = InstanceVariableAccessCfgNode.super.getExpr()
661+
}
662+
}
663+
655664
/** A control-flow node that wraps an `InstanceVariableWriteAccess` AST expression. */
656-
class InstanceVariableWriteAccessCfgNode extends ExprCfgNode {
657-
override InstanceVariableWriteAccess e;
665+
class InstanceVariableWriteAccessCfgNode extends InstanceVariableAccessCfgNode {
666+
InstanceVariableWriteAccessCfgNode() { this.getNode() instanceof InstanceVariableWriteAccess }
658667

659-
final override InstanceVariableWriteAccess getExpr() { result = ExprCfgNode.super.getExpr() }
668+
final override InstanceVariableWriteAccess getExpr() {
669+
result = InstanceVariableAccessCfgNode.super.getExpr()
670+
}
660671
}
661672

662673
/** A control-flow node that wraps a `StringInterpolationComponent` AST expression. */

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -794,8 +794,7 @@ predicate jumpStep(Node pred, Node succ) {
794794
predicate storeStep(Node node1, ContentSet c, Node node2) {
795795
// Instance variable assignment, `@var = src`
796796
node2.(PostUpdateNode).getPreUpdateNode().asExpr() =
797-
any(CfgNodes::ExprNodes::InstanceVariableAccessCfgNode var |
798-
var.getExpr() instanceof InstanceVariableWriteAccess and
797+
any(CfgNodes::ExprNodes::InstanceVariableWriteAccessCfgNode var |
799798
exists(CfgNodes::ExprNodes::AssignExprCfgNode assign |
800799
var = assign.getLhs() and
801800
node1.asExpr() = assign.getRhs()
@@ -815,8 +814,7 @@ predicate storeStep(Node node1, ContentSet c, Node node2) {
815814
predicate readStep(Node node1, ContentSet c, Node node2) {
816815
// Instance variable read access, `@var`
817816
node2.asExpr() =
818-
any(CfgNodes::ExprNodes::InstanceVariableAccessCfgNode var |
819-
var.getExpr() instanceof InstanceVariableReadAccess and
817+
any(CfgNodes::ExprNodes::InstanceVariableReadAccessCfgNode var |
820818
node1.asExpr() = var.getReceiver() and
821819
c.isSingleton(any(Content::FieldContent ct |
822820
ct.getName() = var.getExpr().getVariable().getName()

0 commit comments

Comments
 (0)