@@ -1296,12 +1296,9 @@ private predicate summarizedHigherOrderCall(
1296
1296
Function f , DataFlow:: InvokeNode outer , DataFlow:: InvokeNode inner , int j ,
1297
1297
DataFlow:: Node innerArg , DataFlow:: SourceNode cbParm , PathSummary oldSummary
1298
1298
|
1299
- reachableFromInput ( f , outer , arg , innerArg , cfg , oldSummary ) and
1300
- // Only track actual parameter flow.
1301
1299
// Captured flow does not need to be summarized - it is handled by the local case in `higherOrderCall`.
1302
1300
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 )
1305
1302
|
1306
1303
// direct higher-order call
1307
1304
cbParm .flowsTo ( inner .getCalleeNode ( ) ) and
@@ -1317,6 +1314,21 @@ private predicate summarizedHigherOrderCall(
1317
1314
)
1318
1315
}
1319
1316
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
+
1320
1332
/**
1321
1333
* Holds if `arg` is passed as the `i`th argument to `callback` through a callback invocation.
1322
1334
*
0 commit comments