Ruby: use InstanceVariableRead/WriteAccess CFG nodes

This commit is contained in:
Arthur Baars
2022-05-23 12:03:11 +02:00
parent 5fa4f07f7d
commit d86983b7c8
2 changed files with 18 additions and 9 deletions

View File

@@ -623,7 +623,7 @@ module ExprNodes {
class InstanceVariableAccessCfgNode extends ExprCfgNode {
override InstanceVariableAccessMapping e;
final override InstanceVariableAccess getExpr() { result = ExprCfgNode.super.getExpr() }
override InstanceVariableAccess getExpr() { result = ExprCfgNode.super.getExpr() }
/**
* Gets the synthetic receiver(`self`) of this instance variable access.
@@ -652,11 +652,22 @@ module ExprNodes {
final override ConstantWriteAccess getExpr() { result = ExprCfgNode.super.getExpr() }
}
/** A control-flow node that wraps an `InstanceVariableWriteAccess` AST expression. */
class InstanceVariableWriteAccessCfgNode extends ExprCfgNode {
override InstanceVariableWriteAccess e;
/** A control-flow node that wraps an `InstanceVariableReadAccess` AST expression. */
class InstanceVariableReadAccessCfgNode extends InstanceVariableAccessCfgNode {
InstanceVariableReadAccessCfgNode() { this.getNode() instanceof InstanceVariableReadAccess }
final override InstanceVariableWriteAccess getExpr() { result = ExprCfgNode.super.getExpr() }
final override InstanceVariableReadAccess getExpr() {
result = InstanceVariableAccessCfgNode.super.getExpr()
}
}
/** A control-flow node that wraps an `InstanceVariableWriteAccess` AST expression. */
class InstanceVariableWriteAccessCfgNode extends InstanceVariableAccessCfgNode {
InstanceVariableWriteAccessCfgNode() { this.getNode() instanceof InstanceVariableWriteAccess }
final override InstanceVariableWriteAccess getExpr() {
result = InstanceVariableAccessCfgNode.super.getExpr()
}
}
/** A control-flow node that wraps a `StringInterpolationComponent` AST expression. */

View File

@@ -794,8 +794,7 @@ predicate jumpStep(Node pred, Node succ) {
predicate storeStep(Node node1, ContentSet c, Node node2) {
// Instance variable assignment, `@var = src`
node2.(PostUpdateNode).getPreUpdateNode().asExpr() =
any(CfgNodes::ExprNodes::InstanceVariableAccessCfgNode var |
var.getExpr() instanceof InstanceVariableWriteAccess and
any(CfgNodes::ExprNodes::InstanceVariableWriteAccessCfgNode var |
exists(CfgNodes::ExprNodes::AssignExprCfgNode assign |
var = assign.getLhs() and
node1.asExpr() = assign.getRhs()
@@ -815,8 +814,7 @@ predicate storeStep(Node node1, ContentSet c, Node node2) {
predicate readStep(Node node1, ContentSet c, Node node2) {
// Instance variable read access, `@var`
node2.asExpr() =
any(CfgNodes::ExprNodes::InstanceVariableAccessCfgNode var |
var.getExpr() instanceof InstanceVariableReadAccess and
any(CfgNodes::ExprNodes::InstanceVariableReadAccessCfgNode var |
node1.asExpr() = var.getReceiver() and
c.isSingleton(any(Content::FieldContent ct |
ct.getName() = var.getExpr().getVariable().getName()