@@ -190,6 +190,8 @@ module MakeImpl<InputSig Lang> {
190
190
191
191
private class ArgNodeEx extends NodeEx {
192
192
ArgNodeEx ( ) { this .asNode ( ) instanceof ArgNode }
193
+
194
+ DataFlowCall getCall ( ) { this .asNode ( ) .( ArgNode ) .argumentOf ( result , _) }
193
195
}
194
196
195
197
private class ParamNodeEx extends NodeEx {
@@ -1155,7 +1157,6 @@ module MakeImpl<InputSig Lang> {
1155
1157
1156
1158
DataFlowCallable viableImplCallContextReducedReverse ( DataFlowCall call , CcNoCall ctx ) ;
1157
1159
1158
- bindingset [ ctx]
1159
1160
predicate viableImplNotCallContextReducedReverse ( CcNoCall ctx ) ;
1160
1161
1161
1162
bindingset [ call, c]
@@ -1201,7 +1202,7 @@ module MakeImpl<InputSig Lang> {
1201
1202
1202
1203
pragma [ nomagic]
1203
1204
private predicate flowIntoCallApa (
1204
- DataFlowCall call , ArgNodeEx arg , ParamNodeEx p , DataFlowCallable c ,
1205
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p ,
1205
1206
boolean allowsFieldFlow , ApApprox apa
1206
1207
) {
1207
1208
flowIntoCall ( call , arg , p , allowsFieldFlow ) and
@@ -1212,7 +1213,7 @@ module MakeImpl<InputSig Lang> {
1212
1213
1213
1214
pragma [ nomagic]
1214
1215
private predicate flowOutOfCallApa (
1215
- DataFlowCall call , RetNodeEx ret , DataFlowCallable c , ReturnKindExt kind , NodeEx out ,
1216
+ DataFlowCall call , DataFlowCallable c , RetNodeEx ret , ReturnKindExt kind , NodeEx out ,
1216
1217
boolean allowsFieldFlow , ApApprox apa
1217
1218
) {
1218
1219
flowOutOfCall ( call , ret , kind , out , allowsFieldFlow ) and
@@ -1227,7 +1228,7 @@ module MakeImpl<InputSig Lang> {
1227
1228
ApApprox argApa , ApApprox apa
1228
1229
) {
1229
1230
exists ( ReturnKindExt kind |
1230
- flowOutOfCallApa ( call , ret , _ , kind , out , allowsFieldFlow , apa ) and
1231
+ flowOutOfCallApa ( call , _ , ret , kind , out , allowsFieldFlow , apa ) and
1231
1232
PrevStage:: callMayFlowThroughRev ( call ) and
1232
1233
PrevStage:: returnMayFlowThrough ( ret , argApa , apa , kind ) and
1233
1234
matchesCall ( ccc , call )
@@ -1413,31 +1414,30 @@ module MakeImpl<InputSig Lang> {
1413
1414
}
1414
1415
1415
1416
pragma [ nomagic]
1416
- private predicate fwdFlowIn0 (
1417
- DataFlowCall call , ArgNodeEx arg , FlowState state , Cc outercc , ParamNodeOption summaryCtx ,
1418
- TypOption argT , ApOption argAp , Typ t , Ap ap , ApApprox apa
1417
+ private predicate flowIntoCallApaCallContextReduced (
1418
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p ,
1419
+ boolean allowsFieldFlow , ApApprox apa , CcCall outercc
1419
1420
) {
1420
- fwdFlow ( arg , state , outercc , summaryCtx , argT , argAp , t , ap , apa ) and
1421
- flowIntoCallApa ( call , arg , _ , _ , _ , _ )
1421
+ c = viableImplCallContextReduced ( call , outercc ) and
1422
+ flowIntoCallApa ( call , c , arg , p , allowsFieldFlow , apa )
1422
1423
}
1423
1424
1424
- pragma [ nomagic]
1425
- private predicate fwdFlowInCallContextReduced (
1426
- DataFlowCall call , ArgNodeEx arg , FlowState state , CcCall outercc ,
1427
- ParamNodeOption summaryCtx , TypOption argT , ApOption argAp , Typ t , Ap ap , ApApprox apa ,
1428
- DataFlowCallable inner
1425
+ bindingset [ arg, outercc]
1426
+ pragma [ inline_late]
1427
+ private predicate viableImplArgNotCallContextReduced (
1428
+ DataFlowCall call , ArgNodeEx arg , Cc outercc
1429
1429
) {
1430
- fwdFlowIn0 ( call , arg , state , outercc , summaryCtx , argT , argAp , t , ap , apa ) and
1431
- inner = viableImplCallContextReduced ( call , outercc )
1430
+ call = arg . getCall ( ) and
1431
+ viableImplNotCallContextReduced ( call , outercc )
1432
1432
}
1433
1433
1434
- pragma [ nomagic]
1435
- private predicate fwdFlowInNotCallContextReduced (
1436
- DataFlowCall call , ArgNodeEx arg , FlowState state , Cc outercc , ParamNodeOption summaryCtx ,
1437
- TypOption argT , ApOption argAp , Typ t , Ap ap , ApApprox apa
1434
+ bindingset [ call]
1435
+ pragma [ inline_late]
1436
+ private predicate flowIntoCallApaInlineLate (
1437
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p ,
1438
+ boolean allowsFieldFlow , ApApprox apa
1438
1439
) {
1439
- fwdFlowIn0 ( call , arg , state , outercc , summaryCtx , argT , argAp , t , ap , apa ) and
1440
- viableImplNotCallContextReduced ( call , outercc )
1440
+ flowIntoCallApa ( call , c , arg , p , allowsFieldFlow , apa )
1441
1441
}
1442
1442
1443
1443
pragma [ nomagic]
@@ -1446,44 +1446,37 @@ module MakeImpl<InputSig Lang> {
1446
1446
ParamNodeOption summaryCtx , TypOption argT , ApOption argAp , Typ t , Ap ap , ApApprox apa
1447
1447
) {
1448
1448
exists ( ArgNodeEx arg , boolean allowsFieldFlow , DataFlowCallable inner |
1449
- fwdFlowInCallContextReduced ( call , arg , state , outercc , summaryCtx , argT , argAp , t , ap ,
1450
- apa , inner )
1451
- or
1452
- fwdFlowInNotCallContextReduced ( call , arg , state , outercc , summaryCtx , argT , argAp , t ,
1453
- ap , apa )
1449
+ fwdFlow ( arg , state , outercc , summaryCtx , argT , argAp , t , ap , apa ) and
1450
+ (
1451
+ flowIntoCallApaCallContextReduced ( call , inner , arg , p , allowsFieldFlow , apa , outercc )
1452
+ or
1453
+ viableImplArgNotCallContextReduced ( call , arg , outercc ) and
1454
+ flowIntoCallApaInlineLate ( call , inner , arg , p , allowsFieldFlow , apa )
1455
+ )
1454
1456
|
1455
- flowIntoCallApa ( call , arg , p , inner , allowsFieldFlow , apa ) and
1456
1457
innercc = getCallContextCall ( call , inner ) and
1457
1458
if allowsFieldFlow = false then ap instanceof ApNil else any ( )
1458
1459
)
1459
1460
}
1460
1461
1461
1462
pragma [ nomagic]
1462
- private predicate fwdFlowOut0 (
1463
- RetNodeEx ret , FlowState state , CcNoCall innercc , ParamNodeOption summaryCtx ,
1464
- TypOption argT , ApOption argAp , Typ t , Ap ap , ApApprox apa , DataFlowCallable inner
1465
- ) {
1466
- fwdFlow ( ret , state , innercc , summaryCtx , argT , argAp , t , ap , apa ) and
1467
- inner = ret .getEnclosingCallable ( )
1468
- }
1469
-
1470
- pragma [ nomagic]
1471
- private predicate fwdFlowOutCallContextReduced (
1472
- DataFlowCall call , RetNodeEx ret , FlowState state , CcNoCall innercc ,
1473
- ParamNodeOption summaryCtx , TypOption argT , ApOption argAp , Typ t , Ap ap , ApApprox apa ,
1474
- DataFlowCallable inner
1463
+ private predicate flowOutOfCallApaCallContextReduced (
1464
+ DataFlowCall call , DataFlowCallable c , RetNodeEx ret , NodeEx out , boolean allowsFieldFlow ,
1465
+ ApApprox apa , CcNoCall innercc
1475
1466
) {
1476
- fwdFlowOut0 ( ret , state , innercc , summaryCtx , argT , argAp , t , ap , apa , inner ) and
1477
- inner = viableImplCallContextReducedReverse ( call , innercc )
1467
+ flowOutOfCallApa ( call , c , ret , _ , out , allowsFieldFlow , apa ) and
1468
+ c = viableImplCallContextReducedReverse ( call , innercc )
1478
1469
}
1479
1470
1480
- pragma [ nomagic]
1481
- private predicate fwdFlowOutNotCallContextReduced (
1482
- RetNodeEx ret , FlowState state , CcNoCall innercc , ParamNodeOption summaryCtx ,
1483
- TypOption argT , ApOption argAp , Typ t , Ap ap , ApApprox apa , DataFlowCallable inner
1471
+ bindingset [ ret, apa, innercc]
1472
+ pragma [ inline_late]
1473
+ pragma [ noopt]
1474
+ private predicate flowOutOfCallApaNotCallContextReduced (
1475
+ DataFlowCall call , DataFlowCallable c , RetNodeEx ret , NodeEx out , boolean allowsFieldFlow ,
1476
+ ApApprox apa , CcNoCall innercc
1484
1477
) {
1485
- fwdFlowOut0 ( ret , state , innercc , summaryCtx , argT , argAp , t , ap , apa , inner ) and
1486
- viableImplNotCallContextReducedReverse ( innercc )
1478
+ viableImplNotCallContextReducedReverse ( innercc ) and
1479
+ flowOutOfCallApa ( call , c , ret , _ , out , allowsFieldFlow , apa )
1487
1480
}
1488
1481
1489
1482
// inline to reduce number of iterations
@@ -1496,13 +1489,15 @@ module MakeImpl<InputSig Lang> {
1496
1489
DataFlowCall call , RetNodeEx ret , boolean allowsFieldFlow , CcNoCall innercc ,
1497
1490
DataFlowCallable inner
1498
1491
|
1499
- fwdFlowOutCallContextReduced ( call , ret , state , innercc , summaryCtx , argT , argAp , t , ap ,
1500
- apa , inner )
1501
- or
1502
- fwdFlowOutNotCallContextReduced ( ret , state , innercc , summaryCtx , argT , argAp , t , ap ,
1503
- apa , inner )
1492
+ fwdFlow ( ret , state , innercc , summaryCtx , argT , argAp , t , ap , apa ) and
1493
+ (
1494
+ flowOutOfCallApaCallContextReduced ( call , inner , ret , out , allowsFieldFlow , apa ,
1495
+ innercc )
1496
+ or
1497
+ flowOutOfCallApaNotCallContextReduced ( call , inner , ret , out , allowsFieldFlow , apa ,
1498
+ innercc )
1499
+ )
1504
1500
|
1505
- flowOutOfCallApa ( call , ret , inner , _, out , allowsFieldFlow , apa ) and
1506
1501
outercc = getCallContextReturn ( inner , call ) and
1507
1502
if allowsFieldFlow = false then ap instanceof ApNil else any ( )
1508
1503
)
@@ -1605,7 +1600,7 @@ module MakeImpl<InputSig Lang> {
1605
1600
DataFlowCall call , ArgNodeEx arg , ParamNodeEx p , boolean allowsFieldFlow , Ap argAp , Ap ap
1606
1601
) {
1607
1602
exists ( ApApprox argApa , Typ argT |
1608
- flowIntoCallApa ( call , pragma [ only_bind_into ] ( arg ) , pragma [ only_bind_into ] ( p ) , _ ,
1603
+ flowIntoCallApa ( call , _ , pragma [ only_bind_into ] ( arg ) , pragma [ only_bind_into ] ( p ) ,
1609
1604
allowsFieldFlow , argApa ) and
1610
1605
fwdFlow ( arg , _, _, _, _, _, pragma [ only_bind_into ] ( argT ) , pragma [ only_bind_into ] ( argAp ) ,
1611
1606
argApa ) and
@@ -1618,7 +1613,7 @@ module MakeImpl<InputSig Lang> {
1618
1613
pragma [ nomagic]
1619
1614
private predicate flowIntoCallAp ( DataFlowCall call , ArgNodeEx arg , ParamNodeEx p , Ap ap ) {
1620
1615
exists ( ApApprox apa , boolean allowsFieldFlow |
1621
- flowIntoCallApa ( call , arg , p , _ , allowsFieldFlow , apa ) and
1616
+ flowIntoCallApa ( call , _ , arg , p , allowsFieldFlow , apa ) and
1622
1617
fwdFlow ( arg , _, _, _, _, _, _, ap , apa ) and
1623
1618
if allowsFieldFlow = false then ap instanceof ApNil else any ( )
1624
1619
)
@@ -1629,7 +1624,7 @@ module MakeImpl<InputSig Lang> {
1629
1624
DataFlowCall call , RetNodeEx ret , ReturnPosition pos , NodeEx out , Ap ap
1630
1625
) {
1631
1626
exists ( ApApprox apa , boolean allowsFieldFlow |
1632
- flowOutOfCallApa ( call , ret , _ , _, out , allowsFieldFlow , apa ) and
1627
+ flowOutOfCallApa ( call , _ , ret , _, out , allowsFieldFlow , apa ) and
1633
1628
fwdFlow ( ret , _, _, _, _, _, _, ap , apa ) and
1634
1629
pos = ret .getReturnPosition ( ) and
1635
1630
if allowsFieldFlow = false then ap instanceof ApNil else any ( )
@@ -1968,7 +1963,6 @@ module MakeImpl<InputSig Lang> {
1968
1963
none ( )
1969
1964
}
1970
1965
1971
- bindingset [ ctx]
1972
1966
predicate viableImplNotCallContextReducedReverse ( CcNoCall ctx ) { any ( ) }
1973
1967
1974
1968
bindingset [ call, c]
@@ -2043,7 +2037,6 @@ module MakeImpl<InputSig Lang> {
2043
2037
result = prunedViableImplInCallContextReverse ( call , ctx )
2044
2038
}
2045
2039
2046
- bindingset [ ctx]
2047
2040
predicate viableImplNotCallContextReducedReverse ( CcNoCall ctx ) {
2048
2041
ctx instanceof CallContextAny
2049
2042
}
0 commit comments