@@ -1356,19 +1356,20 @@ private predicate summarizedHigherOrderCall(
1356
1356
DataFlow:: Node arg , DataFlow:: Node cb , int i , DataFlow:: Configuration cfg , PathSummary summary
1357
1357
) {
1358
1358
exists (
1359
- Function f , DataFlow:: InvokeNode outer , DataFlow :: InvokeNode inner , int j ,
1360
- DataFlow:: Node innerArg , DataFlow :: SourceNode cbParm , PathSummary oldSummary
1359
+ Function f , DataFlow:: InvokeNode inner , int j , DataFlow :: Node innerArg ,
1360
+ DataFlow:: SourceNode cbParm , PathSummary oldSummary
1361
1361
|
1362
1362
// Captured flow does not need to be summarized - it is handled by the local case in `higherOrderCall`.
1363
- not arg = DataFlow:: capturedVariableNode ( _) and
1364
- summarizedHigherOrderCallAux ( f , outer , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb )
1363
+ not arg = DataFlow:: capturedVariableNode ( _)
1365
1364
|
1366
1365
// direct higher-order call
1366
+ summarizedHigherOrderCallAux ( f , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb ) and
1367
1367
cbParm .flowsTo ( inner .getCalleeNode ( ) ) and
1368
1368
i = j and
1369
1369
summary = oldSummary
1370
1370
or
1371
1371
// indirect higher-order call
1372
+ summarizedHigherOrderCallAux ( f , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb ) and
1372
1373
exists ( DataFlow:: Node cbArg , PathSummary newSummary |
1373
1374
cbParm .flowsTo ( cbArg ) and
1374
1375
summarizedHigherOrderCall ( innerArg , cbArg , i , cfg , newSummary ) and
@@ -1382,14 +1383,17 @@ private predicate summarizedHigherOrderCall(
1382
1383
*/
1383
1384
pragma [ noinline]
1384
1385
private predicate summarizedHigherOrderCallAux (
1385
- Function f , DataFlow:: InvokeNode outer , DataFlow:: Node arg , DataFlow:: Node innerArg ,
1386
- DataFlow :: Configuration cfg , PathSummary oldSummary , DataFlow:: SourceNode cbParm ,
1387
- DataFlow:: InvokeNode inner , int j , DataFlow :: Node cb
1386
+ Function f , DataFlow:: Node arg , DataFlow:: Node innerArg , DataFlow:: Configuration cfg ,
1387
+ PathSummary oldSummary , DataFlow:: SourceNode cbParm , DataFlow :: InvokeNode inner , int j ,
1388
+ DataFlow:: Node cb
1388
1389
) {
1389
- reachableFromInput ( f , outer , arg , innerArg , cfg , oldSummary ) and
1390
- // Only track actual parameter flow.
1391
- argumentPassing ( outer , cb , f , cbParm ) and
1392
- innerArg = inner .getArgument ( j )
1390
+ exists ( DataFlow:: Node outer1 , DataFlow:: Node outer2 |
1391
+ reachableFromInput ( f , outer1 , arg , innerArg , cfg , oldSummary ) and
1392
+ outer1 = pragma [ only_bind_into ] ( outer2 ) and
1393
+ // Only track actual parameter flow.
1394
+ argumentPassing ( outer2 , cb , f , cbParm ) and
1395
+ innerArg = inner .getArgument ( j )
1396
+ )
1393
1397
}
1394
1398
1395
1399
/**
0 commit comments