@@ -1356,19 +1356,20 @@ private predicate summarizedHigherOrderCall(
13561356 DataFlow:: Node arg , DataFlow:: Node cb , int i , DataFlow:: Configuration cfg , PathSummary summary
13571357) {
13581358 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
13611361 |
13621362 // 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 ( _)
13651364 |
13661365 // direct higher-order call
1366+ summarizedHigherOrderCallAux ( f , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb ) and
13671367 cbParm .flowsTo ( inner .getCalleeNode ( ) ) and
13681368 i = j and
13691369 summary = oldSummary
13701370 or
13711371 // indirect higher-order call
1372+ summarizedHigherOrderCallAux ( f , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb ) and
13721373 exists ( DataFlow:: Node cbArg , PathSummary newSummary |
13731374 cbParm .flowsTo ( cbArg ) and
13741375 summarizedHigherOrderCall ( innerArg , cbArg , i , cfg , newSummary ) and
@@ -1382,14 +1383,17 @@ private predicate summarizedHigherOrderCall(
13821383 */
13831384pragma [ noinline]
13841385private 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
13881389) {
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+ )
13931397}
13941398
13951399/**
0 commit comments