@@ -1962,10 +1962,20 @@ cached
19621962private module Cached {
19631963 /**
19641964 * Holds if data flows from `nodeFrom` to `nodeTo` in exactly one local
1965- * (intra-procedural) step.
1965+ * (intra-procedural) step. This relation is only used for local dataflow
1966+ * (for example `DataFlow::localFlow(source, sink)`) so it contains
1967+ * special cases that should only apply to local dataflow.
19661968 */
19671969 cached
1968- predicate localFlowStep ( Node nodeFrom , Node nodeTo ) { simpleLocalFlowStep ( nodeFrom , nodeTo ) }
1970+ predicate localFlowStep ( Node nodeFrom , Node nodeTo ) {
1971+ // common dataflow steps
1972+ simpleLocalFlowStep ( nodeFrom , nodeTo )
1973+ or
1974+ // models-as-data summarized flow for local data flow (i.e. special case for flow
1975+ // through calls to modelled functions, without relying on global dataflow to join
1976+ // the dots).
1977+ FlowSummaryImpl:: Private:: Steps:: summaryThroughStepValue ( nodeFrom , nodeTo , _)
1978+ }
19691979
19701980 private predicate indirectionOperandFlow ( RawIndirectOperand nodeFrom , Node nodeTo ) {
19711981 nodeFrom != nodeTo and
@@ -2031,8 +2041,9 @@ private module Cached {
20312041 /**
20322042 * INTERNAL: do not use.
20332043 *
2034- * This is the local flow predicate that's used as a building block in global
2035- * data flow. It may have less flow than the `localFlowStep` predicate.
2044+ * This is the local flow predicate that's used as a building block in both
2045+ * local and global data flow. It may have less flow than the `localFlowStep`
2046+ * predicate.
20362047 */
20372048 cached
20382049 predicate simpleLocalFlowStep ( Node nodeFrom , Node nodeTo ) {
@@ -2072,11 +2083,8 @@ private module Cached {
20722083 reverseFlow ( nodeFrom , nodeTo )
20732084 or
20742085 // models-as-data summarized flow
2075- FlowSummaryImpl:: Private:: Steps:: summaryThroughStepValue ( nodeFrom , nodeTo , _)
2076- or
20772086 FlowSummaryImpl:: Private:: Steps:: summaryLocalStep ( nodeFrom .( FlowSummaryNode ) .getSummaryNode ( ) ,
20782087 nodeTo .( FlowSummaryNode ) .getSummaryNode ( ) , true )
2079- // TODO: should these really be in the same place?
20802088 }
20812089
20822090 private predicate simpleInstructionLocalFlowStep ( Operand opFrom , Instruction iTo ) {
0 commit comments