@@ -931,12 +931,12 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
931
931
* candidate for the origin of a summary.
932
932
*/
933
933
pragma [ nomagic]
934
- predicate parameterMayFlowThrough ( ParamNodeEx p , Ap ap ) {
934
+ predicate parameterMayFlowThrough ( ParamNodeEx p , boolean emptyAp ) {
935
935
exists ( DataFlowCallable c , ReturnKindExt kind |
936
936
throughFlowNodeCand ( p ) and
937
937
returnFlowCallableNodeCand ( c , kind ) and
938
938
p .getEnclosingCallable ( ) = c and
939
- exists ( ap ) and
939
+ emptyAp = [ true , false ] and
940
940
parameterFlowThroughAllowed ( p , kind )
941
941
)
942
942
}
@@ -957,12 +957,17 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
957
957
}
958
958
959
959
predicate callEdgeArgParam (
960
- DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p ,
961
- boolean allowsFieldFlow , Ap ap
960
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp
962
961
) {
963
- flowIntoCallNodeCand1 ( call , arg , p , allowsFieldFlow ) and
964
- c = p .getEnclosingCallable ( ) and
965
- exists ( ap )
962
+ exists ( boolean allowsFieldFlow |
963
+ flowIntoCallNodeCand1 ( call , arg , p , allowsFieldFlow ) and
964
+ c = p .getEnclosingCallable ( ) and
965
+ (
966
+ emptyAp = true
967
+ or
968
+ allowsFieldFlow = true and emptyAp = false
969
+ )
970
+ )
966
971
}
967
972
968
973
predicate callEdgeReturn (
@@ -974,7 +979,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
974
979
}
975
980
976
981
predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) {
977
- callEdgeArgParam ( call , c , _, _, _, _ )
982
+ callEdgeArgParam ( call , c , _, _, _)
978
983
}
979
984
980
985
predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) {
@@ -1000,7 +1005,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
1000
1005
tuples = count ( NodeEx n , boolean b | revFlow ( n , b ) ) and
1001
1006
calledges =
1002
1007
count ( DataFlowCall call , DataFlowCallable c |
1003
- callEdgeArgParam ( call , c , _, _, _, _ ) or
1008
+ callEdgeArgParam ( call , c , _, _, _) or
1004
1009
callEdgeReturn ( call , c , _, _, _, _)
1005
1010
)
1006
1011
}
@@ -1282,7 +1287,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
1282
1287
1283
1288
predicate callMayFlowThroughRev ( DataFlowCall call ) ;
1284
1289
1285
- predicate parameterMayFlowThrough ( ParamNodeEx p , Ap ap ) ;
1290
+ predicate parameterMayFlowThrough ( ParamNodeEx p , boolean emptyAp ) ;
1286
1291
1287
1292
predicate returnMayFlowThrough ( RetNodeEx ret , ReturnKindExt kind ) ;
1288
1293
@@ -1294,8 +1299,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
1294
1299
predicate readStepCand ( NodeEx n1 , Content c , NodeEx n2 ) ;
1295
1300
1296
1301
predicate callEdgeArgParam (
1297
- DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p ,
1298
- boolean allowsFieldFlow , Ap ap
1302
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp
1299
1303
) ;
1300
1304
1301
1305
predicate callEdgeReturn (
@@ -1732,42 +1736,27 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
1732
1736
private module FwdFlowIn< flowThroughSig / 0 flowThrough> {
1733
1737
pragma [ nomagic]
1734
1738
private predicate callEdgeArgParamRestricted (
1735
- DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp ,
1736
- ApApprox apa
1739
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp
1737
1740
) {
1738
- exists ( boolean allowsFieldFlow |
1739
- PrevStage:: callEdgeArgParam ( call , c , arg , p , allowsFieldFlow , apa )
1740
- |
1741
- if
1742
- PrevStage:: callMayFlowThroughRev ( call ) and
1743
- PrevStage:: parameterMayFlowThrough ( p , apa )
1744
- then
1745
- emptyAp = true and
1746
- apa instanceof PrevStage:: ApNil and
1747
- flowThrough ( )
1748
- or
1749
- emptyAp = false and
1750
- allowsFieldFlow = true and
1751
- if allowsFieldFlowThrough ( call , c ) then flowThrough ( ) else not flowThrough ( )
1752
- else (
1753
- not flowThrough ( ) and
1754
- (
1755
- emptyAp = true and
1756
- apa instanceof PrevStage:: ApNil
1757
- or
1758
- emptyAp = false and
1759
- allowsFieldFlow = true
1760
- )
1761
- )
1762
- )
1741
+ PrevStage:: callEdgeArgParam ( call , c , arg , p , emptyAp ) and
1742
+ if
1743
+ PrevStage:: callMayFlowThroughRev ( call ) and
1744
+ PrevStage:: parameterMayFlowThrough ( p , emptyAp )
1745
+ then
1746
+ emptyAp = true and
1747
+ flowThrough ( )
1748
+ or
1749
+ emptyAp = false and
1750
+ if allowsFieldFlowThrough ( call , c ) then flowThrough ( ) else not flowThrough ( )
1751
+ else not flowThrough ( )
1763
1752
}
1764
1753
1765
1754
pragma [ nomagic]
1766
1755
private DataFlowCallable viableImplCallContextReducedRestricted (
1767
1756
DataFlowCall call , CcCall ctx
1768
1757
) {
1769
1758
result = viableImplCallContextReduced ( call , ctx ) and
1770
- callEdgeArgParamRestricted ( call , result , _, _, _, _ )
1759
+ callEdgeArgParamRestricted ( call , result , _, _, _)
1771
1760
}
1772
1761
1773
1762
bindingset [ call, ctx]
@@ -1783,18 +1772,17 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
1783
1772
private DataFlowCallable viableImplCallContextReducedInlineLate (
1784
1773
DataFlowCall call , ArgNodeEx arg , CcCall ctx
1785
1774
) {
1786
- callEdgeArgParamRestricted ( call , _, arg , _, _, _ ) and
1775
+ callEdgeArgParamRestricted ( call , _, arg , _, _) and
1787
1776
instanceofCcCall ( ctx ) and
1788
1777
result = viableImplCallContextReducedInlineLate ( call , ctx )
1789
1778
}
1790
1779
1791
1780
bindingset [ call]
1792
1781
pragma [ inline_late]
1793
1782
private predicate callEdgeArgParamRestrictedInlineLate (
1794
- DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp ,
1795
- ApApprox apa
1783
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp
1796
1784
) {
1797
- callEdgeArgParamRestricted ( call , c , arg , p , emptyAp , apa )
1785
+ callEdgeArgParamRestricted ( call , c , arg , p , emptyAp )
1798
1786
}
1799
1787
1800
1788
bindingset [ call, ctx]
@@ -1809,7 +1797,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
1809
1797
private predicate viableImplArgNotCallContextReduced (
1810
1798
DataFlowCall call , ArgNodeEx arg , Cc outercc
1811
1799
) {
1812
- callEdgeArgParamRestricted ( call , _, arg , _, _, _ ) and
1800
+ callEdgeArgParamRestricted ( call , _, arg , _, _) and
1813
1801
instanceofCc ( outercc ) and
1814
1802
viableImplNotCallContextReducedInlineLate ( call , outercc )
1815
1803
}
@@ -1828,7 +1816,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
1828
1816
) and
1829
1817
not outBarrier ( arg , state ) and
1830
1818
not inBarrier ( p , state ) and
1831
- callEdgeArgParamRestrictedInlineLate ( call , inner , arg , p , emptyAp , apa )
1819
+ callEdgeArgParamRestrictedInlineLate ( call , inner , arg , p , emptyAp )
1832
1820
}
1833
1821
1834
1822
pragma [ inline]
@@ -2072,10 +2060,9 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2072
2060
private module FwdTypeFlow = TypeFlow< FwdTypeFlowInput > ;
2073
2061
2074
2062
private predicate flowIntoCallApaTaken (
2075
- DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p ,
2076
- boolean allowsFieldFlow , ApApprox apa
2063
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp
2077
2064
) {
2078
- PrevStage:: callEdgeArgParam ( call , c , arg , p , allowsFieldFlow , apa ) and
2065
+ PrevStage:: callEdgeArgParam ( call , c , arg , p , emptyAp ) and
2079
2066
FwdTypeFlowInput:: dataFlowTakenCallEdgeIn ( call , c , _)
2080
2067
}
2081
2068
@@ -2177,27 +2164,27 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2177
2164
2178
2165
pragma [ nomagic]
2179
2166
private predicate flowThroughIntoCall (
2180
- DataFlowCall call , ArgNodeEx arg , ParamNodeEx p , boolean allowsFieldFlow , Ap argAp , Ap ap
2167
+ DataFlowCall call , ArgNodeEx arg , ParamNodeEx p , Ap argAp , Ap ap
2181
2168
) {
2182
- exists ( ApApprox argApa , Typ argT , TypOption argStored |
2169
+ exists ( ApApprox argApa , Typ argT , TypOption argStored , boolean emptyArgAp |
2183
2170
returnFlowsThrough ( _, _, _, _, pragma [ only_bind_into ] ( p ) , pragma [ only_bind_into ] ( argT ) ,
2184
2171
pragma [ only_bind_into ] ( argAp ) , pragma [ only_bind_into ] ( argApa ) ,
2185
2172
pragma [ only_bind_into ] ( argStored ) , ap ) and
2186
- flowIntoCallApaTaken ( call , _, pragma [ only_bind_into ] ( arg ) , p , allowsFieldFlow , argApa ) and
2173
+ flowIntoCallApaTaken ( call , _, pragma [ only_bind_into ] ( arg ) , p , emptyArgAp ) and
2187
2174
fwdFlow ( arg , _, _, _, pragma [ only_bind_into ] ( argT ) , pragma [ only_bind_into ] ( argAp ) ,
2188
2175
pragma [ only_bind_into ] ( argApa ) , pragma [ only_bind_into ] ( argStored ) ) and
2189
- if allowsFieldFlow = false then argAp instanceof ApNil else any ( )
2176
+ if argAp instanceof ApNil then emptyArgAp = true else emptyArgAp = false
2190
2177
)
2191
2178
}
2192
2179
2193
2180
pragma [ nomagic]
2194
2181
private predicate flowIntoCallAp (
2195
2182
DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , Ap ap
2196
2183
) {
2197
- exists ( ApApprox apa , boolean allowsFieldFlow |
2198
- flowIntoCallApaTaken ( call , c , arg , p , allowsFieldFlow , apa ) and
2199
- fwdFlow ( arg , _, _, _, _, ap , apa , _) and
2200
- if allowsFieldFlow = false then ap instanceof ApNil else any ( )
2184
+ exists ( boolean emptyAp |
2185
+ flowIntoCallApaTaken ( call , c , arg , p , emptyAp ) and
2186
+ fwdFlow ( arg , _, _, _, _, ap , _ , _) and
2187
+ if ap instanceof ApNil then emptyAp = true else emptyAp = false
2201
2188
)
2202
2189
}
2203
2190
@@ -2282,7 +2269,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2282
2269
// flow through a callable
2283
2270
exists ( DataFlowCall call , ParamNodeEx p , Ap innerReturnAp |
2284
2271
revFlowThrough ( call , returnCtx , p , state , _, returnAp , ap , innerReturnAp ) and
2285
- flowThroughIntoCall ( call , node , p , _ , ap , innerReturnAp )
2272
+ flowThroughIntoCall ( call , node , p , ap , innerReturnAp )
2286
2273
)
2287
2274
or
2288
2275
// flow out of a callable
@@ -2424,10 +2411,13 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2424
2411
private predicate revFlowParamToReturn (
2425
2412
ParamNodeEx p , FlowState state , ReturnPosition pos , Ap returnAp , Ap ap
2426
2413
) {
2427
- revFlow ( pragma [ only_bind_into ] ( p ) , state , TReturnCtxMaybeFlowThrough ( pos ) ,
2428
- apSome ( returnAp ) , pragma [ only_bind_into ] ( ap ) ) and
2429
- parameterFlowThroughAllowed ( p , pos .getKind ( ) ) and
2430
- PrevStage:: parameterMayFlowThrough ( p , getApprox ( ap ) )
2414
+ exists ( boolean emptyAp |
2415
+ revFlow ( pragma [ only_bind_into ] ( p ) , state , TReturnCtxMaybeFlowThrough ( pos ) ,
2416
+ apSome ( returnAp ) , pragma [ only_bind_into ] ( ap ) ) and
2417
+ parameterFlowThroughAllowed ( p , pos .getKind ( ) ) and
2418
+ PrevStage:: parameterMayFlowThrough ( p , emptyAp ) and
2419
+ if ap instanceof ApNil then emptyAp = true else emptyAp = false
2420
+ )
2431
2421
}
2432
2422
2433
2423
pragma [ nomagic]
@@ -2517,13 +2507,21 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2517
2507
}
2518
2508
2519
2509
pragma [ nomagic]
2520
- predicate parameterMayFlowThrough ( ParamNodeEx p , Ap ap ) {
2510
+ private predicate parameterMayFlowThroughAp ( ParamNodeEx p , Ap ap ) {
2521
2511
exists ( ReturnPosition pos |
2522
2512
returnFlowsThrough ( _, pos , _, _, p , _, ap , _, _, _) and
2523
2513
parameterFlowsThroughRev ( p , ap , pos , _)
2524
2514
)
2525
2515
}
2526
2516
2517
+ pragma [ nomagic]
2518
+ predicate parameterMayFlowThrough ( ParamNodeEx p , boolean emptyAp ) {
2519
+ exists ( Ap ap |
2520
+ parameterMayFlowThroughAp ( p , ap ) and
2521
+ if ap instanceof ApNil then emptyAp = true else emptyAp = false
2522
+ )
2523
+ }
2524
+
2527
2525
pragma [ nomagic]
2528
2526
private predicate nodeMayUseSummary0 ( NodeEx n , ParamNodeEx p , FlowState state , Ap ap ) {
2529
2527
exists ( Ap ap0 |
@@ -2540,7 +2538,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2540
2538
pragma [ nomagic]
2541
2539
additional predicate nodeMayUseSummary ( NodeEx n , FlowState state , Ap ap ) {
2542
2540
exists ( ParamNodeEx p |
2543
- parameterMayFlowThrough ( p , ap ) and
2541
+ parameterMayFlowThroughAp ( p , ap ) and
2544
2542
nodeMayUseSummary0 ( n , p , state , ap )
2545
2543
)
2546
2544
}
@@ -2561,7 +2559,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2561
2559
) {
2562
2560
exists ( ParamNodeEx p , Ap innerReturnAp |
2563
2561
revFlowThrough ( call , returnCtx , p , state , _, returnAp , ap , innerReturnAp ) and
2564
- flowThroughIntoCall ( call , arg , p , _ , ap , innerReturnAp )
2562
+ flowThroughIntoCall ( call , arg , p , ap , innerReturnAp )
2565
2563
)
2566
2564
}
2567
2565
@@ -2574,17 +2572,13 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2574
2572
}
2575
2573
2576
2574
predicate callEdgeArgParam (
2577
- DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p ,
2578
- boolean allowsFieldFlow , Ap ap
2575
+ DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , boolean emptyAp
2579
2576
) {
2580
- exists ( FlowState state |
2577
+ exists ( FlowState state , Ap ap |
2581
2578
flowIntoCallAp ( call , c , arg , p , ap ) and
2582
2579
revFlow ( arg , pragma [ only_bind_into ] ( state ) , pragma [ only_bind_into ] ( ap ) ) and
2583
2580
revFlow ( p , pragma [ only_bind_into ] ( state ) , pragma [ only_bind_into ] ( ap ) ) and
2584
- // allowsFieldFlow has already been checked in flowIntoCallAp, since
2585
- // `Ap` is at least as precise as a boolean from Stage 2 and
2586
- // forward, so no need to check it again later.
2587
- allowsFieldFlow = true
2581
+ if ap instanceof ApNil then emptyAp = true else emptyAp = false
2588
2582
|
2589
2583
// both directions are needed for flow-through
2590
2584
RevTypeFlowInput:: dataFlowTakenCallEdgeIn ( call , c , _) or
@@ -2606,7 +2600,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2606
2600
}
2607
2601
2608
2602
predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) {
2609
- callEdgeArgParam ( call , c , _, _, _, _ )
2603
+ callEdgeArgParam ( call , c , _, _, _)
2610
2604
}
2611
2605
2612
2606
predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) {
@@ -2702,7 +2696,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
2702
2696
apNext = ap and
2703
2697
ap instanceof ApNil
2704
2698
or
2705
- callEdgeArgParam ( _, _, node , next , _, ap ) and
2699
+ callEdgeArgParam ( _, _, node , next , _) and
2706
2700
apNext = ap
2707
2701
or
2708
2702
callEdgeReturn ( _, _, node , _, next , _) and
0 commit comments