Skip to content

Commit 9e03b12

Browse files
committed
C#/Java/Ruby/Rust/SSA: Replace DefinitionExt with SourceVariable in data flow integration predicates.
1 parent 39bba7f commit 9e03b12

File tree

10 files changed

+98
-95
lines changed

10 files changed

+98
-95
lines changed

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -456,9 +456,9 @@ module VariableCapture {
456456
Flow::clearsContent(asClosureNode(node), getCapturedVariableContent(c))
457457
}
458458

459-
class CapturedSsaDefinitionExt extends SsaImpl::DefinitionExt {
460-
CapturedSsaDefinitionExt() {
461-
this.getSourceVariable().getAssignable() = any(CapturedVariable v).asLocalScopeVariable()
459+
class CapturedSsaSourceVariable extends Ssa::SourceVariable {
460+
CapturedSsaSourceVariable() {
461+
this.getAssignable() = any(CapturedVariable v).asLocalScopeVariable()
462462
}
463463
}
464464

@@ -509,12 +509,12 @@ module SsaFlow {
509509
result.(Impl::ParameterNode).getParameter() = n.(ExplicitParameterNode).getSsaDefinition()
510510
}
511511

512-
predicate localFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
513-
Impl::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep)
512+
predicate localFlowStep(Ssa::SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep) {
513+
Impl::localFlowStep(v, asNode(nodeFrom), asNode(nodeTo), isUseStep)
514514
}
515515

516-
predicate localMustFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo) {
517-
Impl::localMustFlowStep(def, asNode(nodeFrom), asNode(nodeTo))
516+
predicate localMustFlowStep(Ssa::SourceVariable v, Node nodeFrom, Node nodeTo) {
517+
Impl::localMustFlowStep(v, asNode(nodeFrom), asNode(nodeTo))
518518
}
519519
}
520520

@@ -644,12 +644,10 @@ module LocalFlow {
644644
}
645645

646646
/**
647-
* Holds if the source variable of SSA definition `def` is an instance field.
647+
* Holds if the source variable `v` is an instance field.
648648
*/
649-
predicate usesInstanceField(SsaImpl::DefinitionExt def) {
650-
exists(Ssa::SourceVariables::FieldOrPropSourceVariable fp | fp = def.getSourceVariable() |
651-
not fp.getAssignable().(Modifiable).isStatic()
652-
)
649+
predicate isInstanceField(Ssa::SourceVariables::FieldOrPropSourceVariable v) {
650+
not v.getAssignable().(Modifiable).isStatic()
653651
}
654652

655653
predicate localFlowStepCommon(Node nodeFrom, Node nodeTo) {
@@ -749,10 +747,10 @@ predicate simpleLocalFlowStep(Node nodeFrom, Node nodeTo, string model) {
749747
(
750748
LocalFlow::localFlowStepCommon(nodeFrom, nodeTo)
751749
or
752-
exists(SsaImpl::DefinitionExt def, boolean isUseStep |
753-
SsaFlow::localFlowStep(def, nodeFrom, nodeTo, isUseStep) and
754-
not LocalFlow::usesInstanceField(def) and
755-
not def instanceof VariableCapture::CapturedSsaDefinitionExt
750+
exists(Ssa::SourceVariable v, boolean isUseStep |
751+
SsaFlow::localFlowStep(v, nodeFrom, nodeTo, isUseStep) and
752+
not LocalFlow::isInstanceField(v) and
753+
not v instanceof VariableCapture::CapturedSsaSourceVariable
756754
|
757755
isUseStep = false
758756
or
@@ -3007,13 +3005,13 @@ private predicate delegateCreationStep(Node nodeFrom, Node nodeTo) {
30073005

30083006
/** Extra data-flow steps needed for lambda flow analysis. */
30093007
predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) {
3010-
exists(SsaImpl::DefinitionExt def |
3011-
SsaFlow::localFlowStep(def, nodeFrom, nodeTo, _) and
3008+
exists(Ssa::SourceVariable v |
3009+
SsaFlow::localFlowStep(v, nodeFrom, nodeTo, _) and
30123010
preservesValue = true
30133011
|
3014-
LocalFlow::usesInstanceField(def)
3012+
LocalFlow::isInstanceField(v)
30153013
or
3016-
def instanceof VariableCapture::CapturedSsaDefinitionExt
3014+
v instanceof VariableCapture::CapturedSsaSourceVariable
30173015
)
30183016
or
30193017
delegateCreationStep(nodeFrom, nodeTo) and

csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -967,13 +967,13 @@ private module Cached {
967967
import DataFlowIntegrationImpl
968968

969969
cached
970-
predicate localFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
971-
DataFlowIntegrationImpl::localFlowStep(def, nodeFrom, nodeTo, isUseStep)
970+
predicate localFlowStep(Ssa::SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep) {
971+
DataFlowIntegrationImpl::localFlowStep(v, nodeFrom, nodeTo, isUseStep)
972972
}
973973

974974
cached
975-
predicate localMustFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo) {
976-
DataFlowIntegrationImpl::localMustFlowStep(def, nodeFrom, nodeTo)
975+
predicate localMustFlowStep(Ssa::SourceVariable v, Node nodeFrom, Node nodeTo) {
976+
DataFlowIntegrationImpl::localMustFlowStep(v, nodeFrom, nodeTo)
977977
}
978978

979979
signature predicate guardChecksSig(Guards::Guard g, Expr e, Guards::AbstractValue v);

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowNodes.qll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,12 @@ module SsaFlow {
3636
TExplicitParameterNode(result.(Impl::ParameterNode).getParameter()) = n
3737
}
3838

39-
predicate localFlowStep(
40-
SsaImpl::Impl::DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep
41-
) {
42-
Impl::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep)
39+
predicate localFlowStep(SsaSourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep) {
40+
Impl::localFlowStep(v, asNode(nodeFrom), asNode(nodeTo), isUseStep)
4341
}
4442

45-
predicate localMustFlowStep(SsaImpl::Impl::DefinitionExt def, Node nodeFrom, Node nodeTo) {
46-
Impl::localMustFlowStep(def, asNode(nodeFrom), asNode(nodeTo))
43+
predicate localMustFlowStep(Node nodeFrom, Node nodeTo) {
44+
Impl::localMustFlowStep(_, asNode(nodeFrom), asNode(nodeTo))
4745
}
4846
}
4947

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ predicate localMustFlowStep(Node node1, Node node2) {
168168
node2.(ImplicitInstanceAccess).getInstanceAccess().(OwnInstanceAccess).getEnclosingCallable()
169169
)
170170
or
171-
SsaFlow::localMustFlowStep(_, node1, node2)
171+
SsaFlow::localMustFlowStep(node1, node2)
172172
or
173173
node2.asExpr().(CastingExpr).getExpr() = node1.asExpr()
174174
or

java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -544,15 +544,13 @@ private module Cached {
544544
import DataFlowIntegrationImpl
545545

546546
cached
547-
predicate localFlowStep(Impl::DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
548-
not def instanceof UntrackedDef and
549-
DataFlowIntegrationImpl::localFlowStep(def, nodeFrom, nodeTo, isUseStep)
547+
predicate localFlowStep(TrackedVar v, Node nodeFrom, Node nodeTo, boolean isUseStep) {
548+
DataFlowIntegrationImpl::localFlowStep(v, nodeFrom, nodeTo, isUseStep)
550549
}
551550

552551
cached
553-
predicate localMustFlowStep(Impl::DefinitionExt def, Node nodeFrom, Node nodeTo) {
554-
not def instanceof UntrackedDef and
555-
DataFlowIntegrationImpl::localMustFlowStep(def, nodeFrom, nodeTo)
552+
predicate localMustFlowStep(TrackedVar v, Node nodeFrom, Node nodeTo) {
553+
DataFlowIntegrationImpl::localMustFlowStep(v, nodeFrom, nodeTo)
556554
}
557555

558556
signature predicate guardChecksSig(Guards::Guard g, Expr e, boolean branch);

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,14 @@ module SsaFlow {
111111
n = toParameterNode(result.(Impl::ParameterNode).getParameter())
112112
}
113113

114-
predicate localFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
115-
Impl::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep)
114+
predicate localFlowStep(
115+
SsaImpl::SsaInput::SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep
116+
) {
117+
Impl::localFlowStep(v, asNode(nodeFrom), asNode(nodeTo), isUseStep)
116118
}
117119

118-
predicate localMustFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo) {
119-
Impl::localMustFlowStep(def, asNode(nodeFrom), asNode(nodeTo))
120+
predicate localMustFlowStep(Node nodeFrom, Node nodeTo) {
121+
Impl::localMustFlowStep(_, asNode(nodeFrom), asNode(nodeTo))
120122
}
121123
}
122124

@@ -175,7 +177,7 @@ module LocalFlow {
175177
}
176178

177179
predicate localMustFlowStep(Node node1, Node node2) {
178-
SsaFlow::localMustFlowStep(_, node1, node2)
180+
SsaFlow::localMustFlowStep(node1, node2)
179181
or
180182
node1.asExpr() = node2.asExpr().(CfgNodes::ExprNodes::AssignExprCfgNode).getRhs()
181183
or
@@ -525,10 +527,10 @@ private module Cached {
525527
(
526528
LocalFlow::localFlowStepCommon(nodeFrom, nodeTo)
527529
or
528-
exists(SsaImpl::DefinitionExt def, boolean isUseStep |
529-
SsaFlow::localFlowStep(def, nodeFrom, nodeTo, isUseStep) and
530+
exists(SsaImpl::SsaInput::SourceVariable v, boolean isUseStep |
531+
SsaFlow::localFlowStep(v, nodeFrom, nodeTo, isUseStep) and
530532
// captured variables are handled by the shared `VariableCapture` library
531-
not def instanceof VariableCapture::CapturedSsaDefinitionExt
533+
not v instanceof VariableCapture::CapturedVariable
532534
|
533535
isUseStep = false
534536
or

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,13 +387,13 @@ private module Cached {
387387
import DataFlowIntegrationImpl
388388

389389
cached
390-
predicate localFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
391-
DataFlowIntegrationImpl::localFlowStep(def, nodeFrom, nodeTo, isUseStep)
390+
predicate localFlowStep(SsaInput::SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep) {
391+
DataFlowIntegrationImpl::localFlowStep(v, nodeFrom, nodeTo, isUseStep)
392392
}
393393

394394
cached
395-
predicate localMustFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo) {
396-
DataFlowIntegrationImpl::localMustFlowStep(def, nodeFrom, nodeTo)
395+
predicate localMustFlowStep(SsaInput::SourceVariable v, Node nodeFrom, Node nodeTo) {
396+
DataFlowIntegrationImpl::localMustFlowStep(v, nodeFrom, nodeTo)
397397
}
398398

399399
signature predicate guardChecksSig(Cfg::CfgNodes::AstCfgNode g, Cfg::CfgNode e, boolean branch);

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -608,12 +608,14 @@ module SsaFlow {
608608
n = toParameterNode(result.(SsaFlow::ParameterNode).getParameter())
609609
}
610610

611-
predicate localFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
612-
SsaFlow::localFlowStep(def, asNode(nodeFrom), asNode(nodeTo), isUseStep)
611+
predicate localFlowStep(
612+
SsaImpl::SsaInput::SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep
613+
) {
614+
SsaFlow::localFlowStep(v, asNode(nodeFrom), asNode(nodeTo), isUseStep)
613615
}
614616

615-
predicate localMustFlowStep(SsaImpl::DefinitionExt def, Node nodeFrom, Node nodeTo) {
616-
SsaFlow::localMustFlowStep(def, asNode(nodeFrom), asNode(nodeTo))
617+
predicate localMustFlowStep(Node nodeFrom, Node nodeTo) {
618+
SsaFlow::localMustFlowStep(_, asNode(nodeFrom), asNode(nodeTo))
617619
}
618620
}
619621

@@ -1205,9 +1207,9 @@ module RustDataFlow implements InputSig<Location> {
12051207
(
12061208
LocalFlow::localFlowStepCommon(nodeFrom, nodeTo)
12071209
or
1208-
exists(SsaImpl::DefinitionExt def, boolean isUseStep |
1209-
SsaFlow::localFlowStep(def, nodeFrom, nodeTo, isUseStep) and
1210-
not def instanceof VariableCapture::CapturedSsaDefinitionExt
1210+
exists(SsaImpl::SsaInput::SourceVariable v, boolean isUseStep |
1211+
SsaFlow::localFlowStep(v, nodeFrom, nodeTo, isUseStep) and
1212+
not v instanceof VariableCapture::CapturedVariable
12111213
|
12121214
isUseStep = false
12131215
or
@@ -1514,7 +1516,7 @@ module RustDataFlow implements InputSig<Location> {
15141516
* must also apply to `node1`.
15151517
*/
15161518
predicate localMustFlowStep(Node node1, Node node2) {
1517-
SsaFlow::localMustFlowStep(_, node1, node2)
1519+
SsaFlow::localMustFlowStep(node1, node2)
15181520
or
15191521
FlowSummaryImpl::Private::Steps::summaryLocalMustFlowStep(node1
15201522
.(Node::FlowSummaryNode)
@@ -1688,10 +1690,6 @@ module VariableCapture {
16881690
predicate clearsContent(Node node, CapturedVariableContent c) {
16891691
Flow::clearsContent(asClosureNode(node), c.getVariable())
16901692
}
1691-
1692-
class CapturedSsaDefinitionExt extends SsaImpl::DefinitionExt {
1693-
CapturedSsaDefinitionExt() { this.getSourceVariable() instanceof CapturedVariable }
1694-
}
16951693
}
16961694

16971695
import MakeImpl<Location, RustDataFlow>

rust/ql/lib/codeql/rust/dataflow/internal/SsaImpl.qll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,15 @@ private module Cached {
303303
import DataFlowIntegrationImpl
304304

305305
cached
306-
predicate localFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
307-
DataFlowIntegrationImpl::localFlowStep(def, nodeFrom, nodeTo, isUseStep)
306+
predicate localFlowStep(
307+
SsaInput::SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep
308+
) {
309+
DataFlowIntegrationImpl::localFlowStep(v, nodeFrom, nodeTo, isUseStep)
308310
}
309311

310312
cached
311-
predicate localMustFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo) {
312-
DataFlowIntegrationImpl::localMustFlowStep(def, nodeFrom, nodeTo)
313+
predicate localMustFlowStep(SsaInput::SourceVariable v, Node nodeFrom, Node nodeTo) {
314+
DataFlowIntegrationImpl::localMustFlowStep(v, nodeFrom, nodeTo)
313315
}
314316

315317
signature predicate guardChecksSig(CfgNodes::AstCfgNode g, Cfg::CfgNode e, boolean branch);

shared/ssa/codeql/ssa/Ssa.qll

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,17 +1765,17 @@ module Make<LocationSig Location, InputSig<Location> Input> {
17651765
* Holds if `nodeFrom` corresponds to the reference to `v` at index `i` in
17661766
* `bb`. The boolean `isUseStep` indicates whether `nodeFrom` is an actual
17671767
* read. If it is false then `nodeFrom` may be any of the following: an
1768-
* uncertain write, a certain write, a phi, or a phi read. `def` is the SSA
1769-
* definition that is read/defined at `nodeFrom`.
1768+
* uncertain write, a certain write, a phi, or a phi read.
17701769
*/
17711770
private predicate flowOutOf(
1772-
DefinitionExt def, Node nodeFrom, SourceVariable v, BasicBlock bb, int i, boolean isUseStep
1771+
Node nodeFrom, SourceVariable v, BasicBlock bb, int i, boolean isUseStep
17731772
) {
1774-
nodeFrom.(SsaDefinitionExtNodeImpl).getDefExt() = def and
1775-
def.definesAt(v, bb, i, _) and
1776-
isUseStep = false
1773+
exists(DefinitionExt def |
1774+
nodeFrom.(SsaDefinitionExtNodeImpl).getDefExt() = def and
1775+
def.definesAt(v, bb, i, _) and
1776+
isUseStep = false
1777+
)
17771778
or
1778-
ssaDefReachesReadExt(v, def, bb, i) and
17791779
[nodeFrom, nodeFrom.(ExprPostUpdateNode).getPreUpdateNode()].(ReadNode).readsAt(bb, i, v) and
17801780
isUseStep = true
17811781
}
@@ -1786,27 +1786,29 @@ module Make<LocationSig Location, InputSig<Location> Input> {
17861786
* `isUseStep` is `true` when `nodeFrom` is a (post-update) read node and
17871787
* `nodeTo` is a read node or phi (read) node.
17881788
*/
1789-
predicate localFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo, boolean isUseStep) {
1790-
(
1789+
predicate localFlowStep(SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep) {
1790+
exists(Definition def |
17911791
// Flow from assignment into SSA definition
17921792
DfInput::ssaDefAssigns(def, nodeFrom.(ExprNode).getExpr())
17931793
or
17941794
// Flow from parameter into entry definition
17951795
DfInput::ssaDefInitializesParam(def, nodeFrom.(ParameterNode).getParameter())
1796-
) and
1797-
nodeTo.(SsaDefinitionNode).getDefinition() = def and
1798-
isUseStep = false
1796+
|
1797+
nodeTo.(SsaDefinitionNode).getDefinition() = def and
1798+
v = def.getSourceVariable() and
1799+
isUseStep = false
1800+
)
17991801
or
18001802
// Flow from definition/read to next read
1801-
exists(SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 |
1802-
flowOutOf(def, nodeFrom, v, bb1, i1, isUseStep) and
1803+
exists(BasicBlock bb1, int i1, BasicBlock bb2, int i2 |
1804+
flowOutOf(nodeFrom, v, bb1, i1, isUseStep) and
18031805
AdjacentSsaRefs::adjacentRefRead(bb1, i1, bb2, i2, v) and
18041806
nodeTo.(ReadNode).readsAt(bb2, i2, v)
18051807
)
18061808
or
18071809
// Flow from definition/read to next uncertain write
1808-
exists(SourceVariable v, BasicBlock bb1, int i1, BasicBlock bb2, int i2 |
1809-
flowOutOf(def, nodeFrom, v, bb1, i1, isUseStep) and
1810+
exists(BasicBlock bb1, int i1, BasicBlock bb2, int i2 |
1811+
flowOutOf(nodeFrom, v, bb1, i1, isUseStep) and
18101812
AdjacentSsaRefs::adjacentRefRead(bb1, i1, bb2, i2, v) and
18111813
exists(UncertainWriteDefinition def2 |
18121814
DfInput::allowFlowIntoUncertainDef(def2) and
@@ -1816,36 +1818,41 @@ module Make<LocationSig Location, InputSig<Location> Input> {
18161818
)
18171819
or
18181820
// Flow from definition/read to phi input
1819-
exists(
1820-
SourceVariable v, BasicBlock bb, int i, BasicBlock input, BasicBlock bbPhi,
1821-
DefinitionExt phi
1822-
|
1823-
flowOutOf(def, nodeFrom, v, bb, i, isUseStep) and
1821+
exists(BasicBlock bb, int i, BasicBlock input, BasicBlock bbPhi, DefinitionExt phi |
1822+
flowOutOf(nodeFrom, v, bb, i, isUseStep) and
18241823
AdjacentSsaRefs::adjacentRefPhi(bb, i, input, bbPhi, v) and
18251824
nodeTo = TSsaInputNode(phi, input) and
18261825
phi.definesAt(v, bbPhi, -1, _)
18271826
)
18281827
or
18291828
// Flow from input node to def
1830-
nodeTo.(SsaDefinitionExtNodeImpl).getDefExt() = def and
1831-
def = nodeFrom.(SsaInputNodeImpl).getPhi() and
1832-
isUseStep = false
1829+
exists(DefinitionExt def |
1830+
nodeTo.(SsaDefinitionExtNodeImpl).getDefExt() = def and
1831+
def = nodeFrom.(SsaInputNodeImpl).getPhi() and
1832+
v = def.getSourceVariable() and
1833+
isUseStep = false
1834+
)
18331835
}
18341836

18351837
/** Holds if the value of `nodeTo` is given by `nodeFrom`. */
1836-
predicate localMustFlowStep(DefinitionExt def, Node nodeFrom, Node nodeTo) {
1837-
(
1838+
predicate localMustFlowStep(SourceVariable v, Node nodeFrom, Node nodeTo) {
1839+
exists(Definition def |
18381840
// Flow from assignment into SSA definition
18391841
DfInput::ssaDefAssigns(def, nodeFrom.(ExprNode).getExpr())
18401842
or
18411843
// Flow from parameter into entry definition
18421844
DfInput::ssaDefInitializesParam(def, nodeFrom.(ParameterNode).getParameter())
1843-
) and
1844-
nodeTo.(SsaDefinitionNode).getDefinition() = def
1845+
|
1846+
nodeTo.(SsaDefinitionNode).getDefinition() = def and
1847+
v = def.getSourceVariable()
1848+
)
18451849
or
18461850
// Flow from SSA definition to read
1847-
nodeFrom.(SsaDefinitionExtNodeImpl).getDefExt() = def and
1848-
nodeTo.(ExprNode).getExpr() = DfInput::getARead(def)
1851+
exists(DefinitionExt def |
1852+
nodeFrom.(SsaDefinitionExtNodeImpl).getDefExt() = def and
1853+
nodeTo.(ExprNode).getExpr() = DfInput::getARead(def) and
1854+
v = def.getSourceVariable()
1855+
)
18491856
}
18501857

18511858
/**

0 commit comments

Comments
 (0)