File tree Expand file tree Collapse file tree 1 file changed +28
-0
lines changed
csharp/ql/lib/semmle/code/csharp/dataflow/internal Expand file tree Collapse file tree 1 file changed +28
-0
lines changed Original file line number Diff line number Diff line change @@ -533,8 +533,36 @@ module LocalFlow {
533
533
) and
534
534
not exists ( getALastEvalNode ( result ) )
535
535
}
536
+
537
+ /**
538
+ * Holds if the value of `node2` is given by `node1`.
539
+ */
540
+ predicate localMustFlowStep ( Node node1 , Node node2 ) {
541
+ exists ( Callable c , Expr e |
542
+ node1 .( InstanceParameterNode ) .getCallable ( ) = c and
543
+ node2 .asExpr ( ) = e and
544
+ ( e instanceof ThisAccess or e instanceof BaseAccess ) and
545
+ c = e .getEnclosingCallable ( )
546
+ )
547
+ or
548
+ hasNodePath ( any ( LocalExprStepConfiguration x ) , node1 , node2 ) and
549
+ ( node2 instanceof SsaDefinitionExtNode or node2 .asExpr ( ) instanceof Cast )
550
+ or
551
+ exists ( SsaImpl:: Definition def |
552
+ def = getSsaDefinitionExt ( node1 ) and
553
+ exists ( SsaImpl:: getAReadAtNode ( def , node2 .( ExprNode ) .getControlFlowNode ( ) ) )
554
+ )
555
+ or
556
+ node1 =
557
+ unique( FlowSummaryNode n1 |
558
+ FlowSummaryImpl:: Private:: Steps:: summaryLocalStep ( n1 .getSummaryNode ( ) ,
559
+ node2 .( FlowSummaryNode ) .getSummaryNode ( ) , true )
560
+ )
561
+ }
536
562
}
537
563
564
+ predicate localMustFlowStep = LocalFlow:: localMustFlowStep / 2 ;
565
+
538
566
/**
539
567
* This is the local flow predicate that is used as a building block in global
540
568
* data flow. It excludes SSA flow through instance fields, as flow through fields
You can’t perform that action at this time.
0 commit comments