@@ -1461,19 +1461,20 @@ private predicate summarizedHigherOrderCall(
14611461 DataFlow:: Node arg , DataFlow:: Node cb , int i , DataFlow:: Configuration cfg , PathSummary summary
14621462) {
14631463 exists (
1464- Function f , DataFlow:: InvokeNode outer , DataFlow :: InvokeNode inner , int j ,
1465- DataFlow:: Node innerArg , DataFlow :: SourceNode cbParm , PathSummary oldSummary
1464+ Function f , DataFlow:: InvokeNode inner , int j , DataFlow :: Node innerArg ,
1465+ DataFlow:: SourceNode cbParm , PathSummary oldSummary
14661466 |
14671467 // Captured flow does not need to be summarized - it is handled by the local case in `higherOrderCall`.
1468- not arg = DataFlow:: capturedVariableNode ( _) and
1469- summarizedHigherOrderCallAux ( f , outer , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb )
1468+ not arg = DataFlow:: capturedVariableNode ( _)
14701469 |
14711470 // direct higher-order call
1472- cbParm .flowsTo ( inner .getCalleeNode ( ) ) and
1471+ summarizedHigherOrderCallAux ( f , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb ) and
1472+ inner = cbParm .getAnInvocation ( ) and
14731473 i = j and
14741474 summary = oldSummary
14751475 or
14761476 // indirect higher-order call
1477+ summarizedHigherOrderCallAux ( f , arg , innerArg , cfg , oldSummary , cbParm , inner , j , cb ) and
14771478 exists ( DataFlow:: Node cbArg , PathSummary newSummary |
14781479 cbParm .flowsTo ( cbArg ) and
14791480 summarizedHigherOrderCall ( innerArg , cbArg , i , cfg , newSummary ) and
@@ -1487,14 +1488,17 @@ private predicate summarizedHigherOrderCall(
14871488 */
14881489pragma [ noinline]
14891490private predicate summarizedHigherOrderCallAux (
1490- Function f , DataFlow:: InvokeNode outer , DataFlow:: Node arg , DataFlow:: Node innerArg ,
1491- DataFlow :: Configuration cfg , PathSummary oldSummary , DataFlow:: SourceNode cbParm ,
1492- DataFlow:: InvokeNode inner , int j , DataFlow :: Node cb
1491+ Function f , DataFlow:: Node arg , DataFlow:: Node innerArg , DataFlow:: Configuration cfg ,
1492+ PathSummary oldSummary , DataFlow:: SourceNode cbParm , DataFlow :: InvokeNode inner , int j ,
1493+ DataFlow:: Node cb
14931494) {
1494- reachableFromInput ( f , outer , arg , innerArg , cfg , oldSummary ) and
1495- // Only track actual parameter flow.
1496- argumentPassing ( outer , cb , f , cbParm ) and
1497- innerArg = inner .getArgument ( j )
1495+ exists ( DataFlow:: Node outer1 , DataFlow:: Node outer2 |
1496+ reachableFromInput ( f , outer1 , arg , innerArg , cfg , oldSummary ) and
1497+ outer1 = pragma [ only_bind_into ] ( outer2 ) and
1498+ // Only track actual parameter flow.
1499+ argumentPassing ( outer2 , cb , f , cbParm ) and
1500+ innerArg = inner .getArgument ( j )
1501+ )
14981502}
14991503
15001504/**
0 commit comments