@@ -75,44 +75,54 @@ CfgNodes::ExprCfgNode getAPostUpdateNodeForArg(Argument arg) {
75
75
module LocalFlow {
76
76
private import codeql.ruby.dataflow.internal.SsaImpl
77
77
78
+ /** An SSA definition into which another SSA definition may flow. */
79
+ private class SsaInputDefinitionExtNode extends SsaDefinitionExtNode {
80
+ SsaInputDefinitionExtNode ( ) {
81
+ def instanceof Ssa:: PhiNode
82
+ or
83
+ def instanceof SsaImpl:: PhiReadNode
84
+ //TODO: or def instanceof LocalFlow::UncertainExplicitSsaDefinition
85
+ }
86
+ }
87
+
78
88
/**
79
89
* Holds if `nodeFrom` is a node for SSA definition `def`, which can reach `next`.
80
90
*/
81
91
private predicate localFlowSsaInputFromDef (
82
- SsaDefinitionNode nodeFrom , Ssa :: Definition def , Ssa :: Definition next
92
+ SsaDefinitionExtNode nodeFrom , SsaImpl :: DefinitionExt def , SsaInputDefinitionExtNode next
83
93
) {
84
94
exists ( BasicBlock bb , int i |
85
- lastRefBeforeRedef ( def , bb , i , next ) and
86
- def = nodeFrom .getDefinition ( ) and
87
- def .definesAt ( _, bb , i )
95
+ lastRefBeforeRedefExt ( def , bb , i , next . getDefinitionExt ( ) ) and
96
+ def = nodeFrom .getDefinitionExt ( ) and
97
+ def .definesAt ( _, bb , i , _ )
88
98
)
89
99
}
90
100
91
101
/**
92
102
* Holds if `exprFrom` is a last read of SSA definition `def`, which
93
103
* can reach `next`.
94
104
*/
95
- predicate localFlowSsaInputFromExpr (
96
- CfgNodes:: ExprCfgNode exprFrom , Ssa :: Definition def , Ssa :: Definition next
105
+ predicate localFlowSsaInputFromRead (
106
+ CfgNodes:: ExprCfgNode exprFrom , SsaImpl :: DefinitionExt def , SsaInputDefinitionExtNode next
97
107
) {
98
108
exists ( BasicBlock bb , int i |
99
- lastRefBeforeRedef ( def , bb , i , next ) and
109
+ SsaImpl :: lastRefBeforeRedefExt ( def , bb , i , next . getDefinitionExt ( ) ) and
100
110
exprFrom = bb .getNode ( i ) and
101
111
exprFrom .getExpr ( ) instanceof VariableReadAccess
102
112
)
103
113
}
104
114
105
115
/** Gets the SSA definition node corresponding to parameter `p`. */
106
- SsaDefinitionNode getParameterDefNode ( NamedParameter p ) {
116
+ SsaDefinitionExtNode getParameterDefNode ( NamedParameter p ) {
107
117
exists ( BasicBlock bb , int i |
108
118
bb .getNode ( i ) .getNode ( ) = p .getDefiningAccess ( ) and
109
- result .getDefinition ( ) .definesAt ( _, bb , i )
119
+ result .getDefinitionExt ( ) .definesAt ( _, bb , i , _ )
110
120
)
111
121
}
112
122
113
123
/** Gets the SSA definition node corresponding to the implicit `self` parameter for `m`. */
114
- private SsaDefinitionNode getSelfParameterDefNode ( MethodBase m ) {
115
- result .getDefinition ( ) .( Ssa:: SelfDefinition ) .getSourceVariable ( ) .getDeclaringScope ( ) = m
124
+ private SsaDefinitionExtNode getSelfParameterDefNode ( MethodBase m ) {
125
+ result .getDefinitionExt ( ) .( Ssa:: SelfDefinition ) .getSourceVariable ( ) .getDeclaringScope ( ) = m
116
126
}
117
127
118
128
/**
@@ -136,41 +146,37 @@ module LocalFlow {
136
146
or
137
147
nodeFrom .( SelfParameterNode ) .getSelfVariable ( ) = def .getSourceVariable ( )
138
148
|
139
- nodeTo .( SsaDefinitionNode ) . getDefinition ( ) = def
149
+ nodeTo .( SsaDefinitionExtNode ) . getDefinitionExt ( ) = def
140
150
)
141
151
}
142
152
143
153
/**
144
154
* Holds if there is a local use-use flow step from `nodeFrom` to `nodeTo`
145
155
* involving SSA definition `def`.
146
156
*/
147
- predicate localSsaFlowStepUseUse ( Ssa :: Definition def , Node nodeFrom , Node nodeTo ) {
148
- def . hasAdjacentReads ( nodeFrom .asExpr ( ) , nodeTo .asExpr ( ) )
157
+ predicate localSsaFlowStepUseUse ( SsaImpl :: DefinitionExt def , Node nodeFrom , Node nodeTo ) {
158
+ SsaImpl :: adjacentReadPairExt ( def , nodeFrom .asExpr ( ) , nodeTo .asExpr ( ) )
149
159
}
150
160
151
161
/**
152
162
* Holds if there is a local flow step from `nodeFrom` to `nodeTo` involving
153
163
* SSA definition `def`.
154
164
*/
155
165
private predicate localSsaFlowStep ( Node nodeFrom , Node nodeTo ) {
156
- exists ( Ssa :: Definition def |
166
+ exists ( SsaImpl :: DefinitionExt def |
157
167
// Flow from assignment into SSA definition
158
168
def .( Ssa:: WriteDefinition ) .assigns ( nodeFrom .asExpr ( ) ) and
159
- nodeTo .( SsaDefinitionNode ) . getDefinition ( ) = def
169
+ nodeTo .( SsaDefinitionExtNode ) . getDefinitionExt ( ) = def
160
170
or
161
171
// Flow from SSA definition to first read
162
- def = nodeFrom .( SsaDefinitionNode ) . getDefinition ( ) and
163
- nodeTo .asExpr ( ) = def . getAFirstRead ( )
172
+ def = nodeFrom .( SsaDefinitionExtNode ) . getDefinitionExt ( ) and
173
+ firstReadExt ( def , nodeTo .asExpr ( ) )
164
174
or
165
175
// Flow from read to next read
166
176
localSsaFlowStepUseUse ( def , nodeFrom .( PostUpdateNode ) .getPreUpdateNode ( ) , nodeTo )
167
177
or
168
- // Flow into phi node from definition
169
- exists ( Ssa:: PhiNode phi |
170
- localFlowSsaInputFromDef ( nodeFrom , def , phi ) and
171
- phi = nodeTo .( SsaDefinitionNode ) .getDefinition ( ) and
172
- def = phi .getAnInput ( )
173
- )
178
+ // Flow into phi (read) SSA definition node from def
179
+ localFlowSsaInputFromDef ( nodeFrom , def , nodeTo )
174
180
)
175
181
// TODO
176
182
// or
@@ -287,7 +293,7 @@ private module Cached {
287
293
ret .getKind ( ) = kind
288
294
)
289
295
} or
290
- TSsaDefinitionNode ( Ssa :: Definition def ) or
296
+ TSsaDefinitionExtNode ( SsaImpl :: DefinitionExt def ) or
291
297
TNormalParameterNode ( Parameter p ) {
292
298
p instanceof SimpleParameter or
293
299
p instanceof OptionalParameter or
@@ -352,10 +358,8 @@ private module Cached {
352
358
not FlowSummaryImpl:: Private:: Steps:: prohibitsUseUseFlow ( nodeFrom , _)
353
359
or
354
360
// Flow into phi node from read
355
- exists ( Ssa:: Definition def , Ssa:: PhiNode phi , CfgNodes:: ExprCfgNode exprFrom |
356
- LocalFlow:: localFlowSsaInputFromExpr ( exprFrom , def , phi ) and
357
- phi = nodeTo .( SsaDefinitionNode ) .getDefinition ( ) and
358
- def = phi .getAnInput ( )
361
+ exists ( SsaImpl:: DefinitionExt def , CfgNodes:: ExprCfgNode exprFrom |
362
+ LocalFlow:: localFlowSsaInputFromRead ( exprFrom , def , nodeTo )
359
363
|
360
364
exprFrom = nodeFrom .asExpr ( ) and
361
365
not FlowSummaryImpl:: Private:: Steps:: prohibitsUseUseFlow ( nodeFrom , _)
@@ -400,18 +404,16 @@ private module Cached {
400
404
LocalFlow:: localSsaFlowStepUseUse ( _, nodeFrom , nodeTo )
401
405
or
402
406
// Flow into phi node from read
403
- exists ( Ssa:: Definition def , Ssa:: PhiNode phi , CfgNodes:: ExprCfgNode exprFrom |
404
- LocalFlow:: localFlowSsaInputFromExpr ( exprFrom , def , phi ) and
405
- phi = nodeTo .( SsaDefinitionNode ) .getDefinition ( ) and
406
- def = phi .getAnInput ( ) and
407
+ exists ( SsaImpl:: DefinitionExt def , CfgNodes:: ExprCfgNode exprFrom |
408
+ LocalFlow:: localFlowSsaInputFromRead ( exprFrom , def , nodeTo ) and
407
409
exprFrom = [ nodeFrom .asExpr ( ) , nodeFrom .( PostUpdateNode ) .getPreUpdateNode ( ) .asExpr ( ) ]
408
410
)
409
411
}
410
412
411
- private predicate entrySsaDefinition ( SsaDefinitionNode n ) {
413
+ private predicate entrySsaDefinition ( SsaDefinitionExtNode n ) {
412
414
n = LocalFlow:: getParameterDefNode ( _)
413
415
or
414
- exists ( Ssa :: Definition def | def = n .getDefinition ( ) |
416
+ exists ( SsaImpl :: DefinitionExt def | def = n .getDefinitionExt ( ) |
415
417
def instanceof Ssa:: SelfDefinition
416
418
or
417
419
def instanceof Ssa:: CapturedEntryDefinition
@@ -520,8 +522,9 @@ import Cached
520
522
521
523
/** Holds if `n` should be hidden from path explanations. */
522
524
predicate nodeIsHidden ( Node n ) {
523
- exists ( Ssa :: Definition def | def = n .( SsaDefinitionNode ) . getDefinition ( ) |
525
+ exists ( SsaImpl :: DefinitionExt def | def = n .( SsaDefinitionExtNode ) . getDefinitionExt ( ) |
524
526
def instanceof Ssa:: PhiNode or
527
+ def instanceof SsaImpl:: PhiReadNode or
525
528
def instanceof Ssa:: CapturedEntryDefinition or
526
529
def instanceof Ssa:: CapturedCallDefinition
527
530
)
@@ -542,13 +545,13 @@ predicate nodeIsHidden(Node n) {
542
545
}
543
546
544
547
/** An SSA definition, viewed as a node in a data flow graph. */
545
- class SsaDefinitionNode extends NodeImpl , TSsaDefinitionNode {
546
- Ssa :: Definition def ;
548
+ class SsaDefinitionExtNode extends NodeImpl , TSsaDefinitionExtNode {
549
+ SsaImpl :: DefinitionExt def ;
547
550
548
- SsaDefinitionNode ( ) { this = TSsaDefinitionNode ( def ) }
551
+ SsaDefinitionExtNode ( ) { this = TSsaDefinitionExtNode ( def ) }
549
552
550
553
/** Gets the underlying SSA definition. */
551
- Ssa :: Definition getDefinition ( ) { result = def }
554
+ SsaImpl :: DefinitionExt getDefinitionExt ( ) { result = def }
552
555
553
556
/** Gets the underlying variable. */
554
557
Variable getVariable ( ) { result = def .getSourceVariable ( ) }
@@ -561,7 +564,7 @@ class SsaDefinitionNode extends NodeImpl, TSsaDefinitionNode {
561
564
}
562
565
563
566
/** An SSA definition for a `self` variable. */
564
- class SsaSelfDefinitionNode extends LocalSourceNode , SsaDefinitionNode {
567
+ class SsaSelfDefinitionNode extends LocalSourceNode , SsaDefinitionExtNode {
565
568
private SelfVariable self ;
566
569
567
570
SsaSelfDefinitionNode ( ) { self = def .getSourceVariable ( ) }
@@ -1078,11 +1081,11 @@ private module OutNodes {
1078
1081
import OutNodes
1079
1082
1080
1083
predicate jumpStep ( Node pred , Node succ ) {
1081
- SsaImpl:: captureFlowIn ( _, pred .( SsaDefinitionNode ) . getDefinition ( ) ,
1082
- succ .( SsaDefinitionNode ) . getDefinition ( ) )
1084
+ SsaImpl:: captureFlowIn ( _, pred .( SsaDefinitionExtNode ) . getDefinitionExt ( ) ,
1085
+ succ .( SsaDefinitionExtNode ) . getDefinitionExt ( ) )
1083
1086
or
1084
- SsaImpl:: captureFlowOut ( _, pred .( SsaDefinitionNode ) . getDefinition ( ) ,
1085
- succ .( SsaDefinitionNode ) . getDefinition ( ) )
1087
+ SsaImpl:: captureFlowOut ( _, pred .( SsaDefinitionExtNode ) . getDefinitionExt ( ) ,
1088
+ succ .( SsaDefinitionExtNode ) . getDefinitionExt ( ) )
1086
1089
or
1087
1090
succ .asExpr ( ) .getExpr ( ) .( ConstantReadAccess ) .getValue ( ) = pred .asExpr ( ) .getExpr ( )
1088
1091
or
0 commit comments