@@ -76,20 +76,28 @@ predicate simpleLocalFlowStep = DataFlowPrivate::localFlowStepTypeTracker/2;
76
76
*/
77
77
predicate jumpStep = DataFlowPrivate:: jumpStep / 2 ;
78
78
79
- /**
80
- * Holds if there is a summarized local flow step from `nodeFrom` to `nodeTo`,
81
- * because there is direct flow from a parameter to a return. That is, summarized
82
- * steps are not applied recursively.
83
- */
79
+ /** Holds if there is direct flow from `param` to a return. */
84
80
pragma [ nomagic]
85
- private predicate summarizedLocalStep ( Node nodeFrom , Node nodeTo ) {
86
- exists ( DataFlowPublic :: ParameterNode param , DataFlowPrivate:: ReturningNode returnNode |
81
+ private predicate flowThrough ( DataFlowPublic :: ParameterNode param ) {
82
+ exists ( DataFlowPrivate:: ReturningNode returnNode |
87
83
DataFlowPrivate:: LocalFlow:: getParameterDefNode ( param .getParameter ( ) )
88
84
.( TypeTrackingNode )
89
- .flowsTo ( returnNode ) and
85
+ .flowsTo ( returnNode )
86
+ )
87
+ }
88
+
89
+ /** Holds if there is a level step from `nodeFrom` to `nodeTo`, which may depend on the call graph. */
90
+ pragma [ nomagic]
91
+ predicate levelStepCall ( Node nodeFrom , Node nodeTo ) {
92
+ exists ( DataFlowPublic:: ParameterNode param |
93
+ flowThrough ( param ) and
90
94
callStep ( nodeTo .asExpr ( ) , nodeFrom , param )
91
95
)
92
- or
96
+ }
97
+
98
+ /** Holds if there is a level step from `nodeFrom` to `nodeTo`, which does not depend on the call graph. */
99
+ pragma [ nomagic]
100
+ predicate levelStepNoCall ( Node nodeFrom , Node nodeTo ) {
93
101
exists (
94
102
SummarizedCallable callable , DataFlowPublic:: CallNode call , SummaryComponentStack input ,
95
103
SummaryComponentStack output
@@ -99,11 +107,6 @@ private predicate summarizedLocalStep(Node nodeFrom, Node nodeTo) {
99
107
nodeFrom = evaluateSummaryComponentStackLocal ( callable , call , input ) and
100
108
nodeTo = evaluateSummaryComponentStackLocal ( callable , call , output )
101
109
)
102
- }
103
-
104
- /** Holds if there is a level step from `nodeFrom` to `nodeTo`. */
105
- predicate levelStep ( Node nodeFrom , Node nodeTo ) {
106
- summarizedLocalStep ( nodeFrom , nodeTo )
107
110
or
108
111
localFieldStep ( nodeFrom , nodeTo )
109
112
}
0 commit comments