@@ -1296,12 +1296,9 @@ private predicate summarizedHigherOrderCall(
12961296 Function f , DataFlow:: InvokeNode outer , DataFlow:: InvokeNode inner , int j ,
12971297 DataFlow:: Node innerArg , DataFlow:: SourceNode cbParm , PathSummary oldSummary
12981298 |
1299- reachableFromInput ( f , outer , arg , innerArg , cfg , oldSummary ) and
1300- // Only track actual parameter flow.
13011299 // Captured flow does not need to be summarized - it is handled by the local case in `higherOrderCall`.
13021300 not arg = DataFlow:: capturedVariableNode ( _) and
1303- argumentPassing ( outer , cb , f , cbParm ) and
1304- innerArg = inner .getArgument ( j )
1301+ summarizedHigherOrderCallAux ( f , outer , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb )
13051302 |
13061303 // direct higher-order call
13071304 cbParm .flowsTo ( inner .getCalleeNode ( ) ) and
@@ -1317,6 +1314,21 @@ private predicate summarizedHigherOrderCall(
13171314 )
13181315}
13191316
1317+ /**
1318+ * @see `summarizedHigherOrderCall`.
1319+ */
1320+ pragma [ noinline]
1321+ private predicate summarizedHigherOrderCallAux (
1322+ Function f , DataFlow:: InvokeNode outer , DataFlow:: Node arg , DataFlow:: Node innerArg ,
1323+ DataFlow:: Configuration cfg , PathSummary oldSummary , DataFlow:: SourceNode cbParm ,
1324+ DataFlow:: InvokeNode inner , int j , DataFlow:: Node cb
1325+ ) {
1326+ reachableFromInput ( f , outer , arg , innerArg , cfg , oldSummary ) and
1327+ // Only track actual parameter flow.
1328+ argumentPassing ( outer , cb , f , cbParm ) and
1329+ innerArg = inner .getArgument ( j )
1330+ }
1331+
13201332/**
13211333 * Holds if `arg` is passed as the `i`th argument to `callback` through a callback invocation.
13221334 *
0 commit comments