@@ -83,7 +83,15 @@ SsaImpl::DefinitionExt getParameterDef(NamedParameter p) {
8383
8484/** Provides logic related to SSA. */
8585private module SsaFlow {
86- module Impl = SsaImpl:: DataFlowIntegration;
86+ private module Impl = SsaImpl:: DataFlowIntegration;
87+
88+ private ParameterNodeImpl toParameterNode ( SsaImpl:: ParameterExt p ) {
89+ result = TNormalParameterNode ( p .asParameter ( ) )
90+ or
91+ result = TSelfMethodParameterNode ( p .asMethodSelf ( ) )
92+ or
93+ result = TSelfToplevelParameterNode ( p .asToplevelSelf ( ) )
94+ }
8795
8896 Impl:: Node asNode ( Node n ) {
8997 n = TSsaNode ( result )
@@ -92,11 +100,11 @@ private module SsaFlow {
92100 or
93101 result .( Impl:: ExprPostUpdateNode ) .getExpr ( ) = n .( PostUpdateNode ) .getPreUpdateNode ( ) .asExpr ( )
94102 or
95- n = result .( Impl:: ParameterNode ) .getParameter ( ) . toParameterNode ( )
103+ n = toParameterNode ( result .( Impl:: ParameterNode ) .getParameter ( ) )
96104 }
97105
98- predicate localFlowStep ( SsaImpl:: DefinitionExt def , Node nodeFrom , Node nodeTo ) {
99- Impl:: localFlowStep ( def , asNode ( nodeFrom ) , asNode ( nodeTo ) )
106+ predicate localFlowStep ( SsaImpl:: DefinitionExt def , Node nodeFrom , Node nodeTo , boolean isUseStep ) {
107+ Impl:: localFlowStep ( def , asNode ( nodeFrom ) , asNode ( nodeTo ) , isUseStep )
100108 }
101109
102110 predicate localMustFlowStep ( SsaImpl:: DefinitionExt def , Node nodeFrom , Node nodeTo ) {
@@ -436,7 +444,7 @@ private module Cached {
436444 newtype TNode =
437445 TExprNode ( CfgNodes:: ExprCfgNode n ) or
438446 TReturningNode ( CfgNodes:: ReturningCfgNode n ) { exists ( n .getReturnedValueNode ( ) ) } or
439- TSsaNode ( SsaFlow :: Impl :: SsaNode node ) or
447+ TSsaNode ( SsaImpl :: DataFlowIntegration :: SsaNode node ) or
440448 TCapturedVariableNode ( VariableCapture:: CapturedVariable v ) or
441449 TNormalParameterNode ( SsaImpl:: NormalParameter p ) or
442450 TSelfMethodParameterNode ( MethodBase m ) or
@@ -507,10 +515,13 @@ private module Cached {
507515 (
508516 LocalFlow:: localFlowStepCommon ( nodeFrom , nodeTo )
509517 or
510- exists ( SsaImpl:: DefinitionExt def |
511- SsaFlow:: localFlowStep ( def , nodeFrom , nodeTo ) and
518+ exists ( SsaImpl:: DefinitionExt def , boolean isUseStep |
519+ SsaFlow:: localFlowStep ( def , nodeFrom , nodeTo , isUseStep ) and
512520 // captured variables are handled by the shared `VariableCapture` library
513- not def instanceof VariableCapture:: CapturedSsaDefinitionExt and
521+ not def instanceof VariableCapture:: CapturedSsaDefinitionExt
522+ |
523+ isUseStep = false
524+ or
514525 not FlowSummaryImpl:: Private:: Steps:: prohibitsUseUseFlow ( nodeFrom , _)
515526 )
516527 or
@@ -526,7 +537,7 @@ private module Cached {
526537 predicate localFlowStepImpl ( Node nodeFrom , Node nodeTo ) {
527538 LocalFlow:: localFlowStepCommon ( nodeFrom , nodeTo )
528539 or
529- SsaFlow:: localFlowStep ( _, nodeFrom , nodeTo )
540+ SsaFlow:: localFlowStep ( _, nodeFrom , nodeTo , _ )
530541 or
531542 // Simple flow through library code is included in the exposed local
532543 // step relation, even though flow is technically inter-procedural
@@ -540,7 +551,7 @@ private module Cached {
540551 predicate localFlowStepTypeTracker ( Node nodeFrom , Node nodeTo ) {
541552 LocalFlow:: localFlowStepCommon ( nodeFrom , nodeTo )
542553 or
543- SsaFlow:: localFlowStep ( _, nodeFrom , nodeTo )
554+ SsaFlow:: localFlowStep ( _, nodeFrom , nodeTo , _ )
544555 or
545556 VariableCapture:: flowInsensitiveStep ( nodeFrom , nodeTo )
546557 or
@@ -745,7 +756,7 @@ predicate nodeIsHidden(Node n) {
745756
746757/** An SSA node. */
747758abstract class SsaNode extends NodeImpl , TSsaNode {
748- SsaFlow :: Impl :: SsaNode node ;
759+ SsaImpl :: DataFlowIntegration :: SsaNode node ;
749760 SsaImpl:: DefinitionExt def ;
750761
751762 SsaNode ( ) {
@@ -765,7 +776,7 @@ abstract class SsaNode extends NodeImpl, TSsaNode {
765776
766777/** An (extended) SSA definition, viewed as a node in a data flow graph. */
767778class SsaDefinitionExtNode extends SsaNode {
768- override SsaFlow :: Impl :: SsaDefinitionExtNode node ;
779+ override SsaImpl :: DataFlowIntegration :: SsaDefinitionExtNode node ;
769780
770781 /** Gets the underlying variable. */
771782 Variable getVariable ( ) { result = def .getSourceVariable ( ) }
@@ -827,7 +838,7 @@ class SsaDefinitionNodeImpl extends SsaDefinitionExtNode {
827838 * both inputs into the phi read node after the outer condition are guarded.
828839 */
829840class SsaInputNode extends SsaNode {
830- override SsaFlow :: Impl :: SsaInputNode node ;
841+ override SsaImpl :: DataFlowIntegration :: SsaInputNode node ;
831842
832843 override predicate isHidden ( ) { any ( ) }
833844
0 commit comments