@@ -931,12 +931,12 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
931931 * candidate for the origin of a summary.
932932 */
933933 pragma [ nomagic]
934- predicate parameterMayFlowThrough ( ParamNodeEx p , Ap ap ) {
934+ predicate parameterMayFlowThrough ( ParamNodeEx p , boolean emptyAp ) {
935935 exists ( DataFlowCallable c , ReturnKindExt kind |
936936 throughFlowNodeCand ( p ) and
937937 returnFlowCallableNodeCand ( c , kind ) and
938938 p .getEnclosingCallable ( ) = c and
939- exists ( ap ) and
939+ emptyAp = [ true , false ] and
940940 parameterFlowThroughAllowed ( p , kind )
941941 )
942942 }
@@ -957,12 +957,17 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
957957 }
958958
959959 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
962961 ) {
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+ )
966971 }
967972
968973 predicate callEdgeReturn (
@@ -974,7 +979,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
974979 }
975980
976981 predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) {
977- callEdgeArgParam ( call , c , _, _, _, _ )
982+ callEdgeArgParam ( call , c , _, _, _)
978983 }
979984
980985 predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) {
@@ -1000,7 +1005,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
10001005 tuples = count ( NodeEx n , boolean b | revFlow ( n , b ) ) and
10011006 calledges =
10021007 count ( DataFlowCall call , DataFlowCallable c |
1003- callEdgeArgParam ( call , c , _, _, _, _ ) or
1008+ callEdgeArgParam ( call , c , _, _, _) or
10041009 callEdgeReturn ( call , c , _, _, _, _)
10051010 )
10061011 }
@@ -1282,7 +1287,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
12821287
12831288 predicate callMayFlowThroughRev ( DataFlowCall call ) ;
12841289
1285- predicate parameterMayFlowThrough ( ParamNodeEx p , Ap ap ) ;
1290+ predicate parameterMayFlowThrough ( ParamNodeEx p , boolean emptyAp ) ;
12861291
12871292 predicate returnMayFlowThrough ( RetNodeEx ret , ReturnKindExt kind ) ;
12881293
@@ -1294,8 +1299,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
12941299 predicate readStepCand ( NodeEx n1 , Content c , NodeEx n2 ) ;
12951300
12961301 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
12991303 ) ;
13001304
13011305 predicate callEdgeReturn (
@@ -1732,42 +1736,27 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
17321736 private module FwdFlowIn< flowThroughSig / 0 flowThrough> {
17331737 pragma [ nomagic]
17341738 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
17371740 ) {
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 ( )
17631752 }
17641753
17651754 pragma [ nomagic]
17661755 private DataFlowCallable viableImplCallContextReducedRestricted (
17671756 DataFlowCall call , CcCall ctx
17681757 ) {
17691758 result = viableImplCallContextReduced ( call , ctx ) and
1770- callEdgeArgParamRestricted ( call , result , _, _, _, _ )
1759+ callEdgeArgParamRestricted ( call , result , _, _, _)
17711760 }
17721761
17731762 bindingset [ call, ctx]
@@ -1783,18 +1772,17 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
17831772 private DataFlowCallable viableImplCallContextReducedInlineLate (
17841773 DataFlowCall call , ArgNodeEx arg , CcCall ctx
17851774 ) {
1786- callEdgeArgParamRestricted ( call , _, arg , _, _, _ ) and
1775+ callEdgeArgParamRestricted ( call , _, arg , _, _) and
17871776 instanceofCcCall ( ctx ) and
17881777 result = viableImplCallContextReducedInlineLate ( call , ctx )
17891778 }
17901779
17911780 bindingset [ call]
17921781 pragma [ inline_late]
17931782 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
17961784 ) {
1797- callEdgeArgParamRestricted ( call , c , arg , p , emptyAp , apa )
1785+ callEdgeArgParamRestricted ( call , c , arg , p , emptyAp )
17981786 }
17991787
18001788 bindingset [ call, ctx]
@@ -1809,7 +1797,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
18091797 private predicate viableImplArgNotCallContextReduced (
18101798 DataFlowCall call , ArgNodeEx arg , Cc outercc
18111799 ) {
1812- callEdgeArgParamRestricted ( call , _, arg , _, _, _ ) and
1800+ callEdgeArgParamRestricted ( call , _, arg , _, _) and
18131801 instanceofCc ( outercc ) and
18141802 viableImplNotCallContextReducedInlineLate ( call , outercc )
18151803 }
@@ -1828,7 +1816,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
18281816 ) and
18291817 not outBarrier ( arg , state ) and
18301818 not inBarrier ( p , state ) and
1831- callEdgeArgParamRestrictedInlineLate ( call , inner , arg , p , emptyAp , apa )
1819+ callEdgeArgParamRestrictedInlineLate ( call , inner , arg , p , emptyAp )
18321820 }
18331821
18341822 pragma [ inline]
@@ -2072,10 +2060,9 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
20722060 private module FwdTypeFlow = TypeFlow< FwdTypeFlowInput > ;
20732061
20742062 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
20772064 ) {
2078- PrevStage:: callEdgeArgParam ( call , c , arg , p , allowsFieldFlow , apa ) and
2065+ PrevStage:: callEdgeArgParam ( call , c , arg , p , emptyAp ) and
20792066 FwdTypeFlowInput:: dataFlowTakenCallEdgeIn ( call , c , _)
20802067 }
20812068
@@ -2177,27 +2164,27 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
21772164
21782165 pragma [ nomagic]
21792166 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
21812168 ) {
2182- exists ( ApApprox argApa , Typ argT , TypOption argStored |
2169+ exists ( ApApprox argApa , Typ argT , TypOption argStored , boolean emptyArgAp |
21832170 returnFlowsThrough ( _, _, _, _, pragma [ only_bind_into ] ( p ) , pragma [ only_bind_into ] ( argT ) ,
21842171 pragma [ only_bind_into ] ( argAp ) , pragma [ only_bind_into ] ( argApa ) ,
21852172 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
21872174 fwdFlow ( arg , _, _, _, pragma [ only_bind_into ] ( argT ) , pragma [ only_bind_into ] ( argAp ) ,
21882175 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
21902177 )
21912178 }
21922179
21932180 pragma [ nomagic]
21942181 private predicate flowIntoCallAp (
21952182 DataFlowCall call , DataFlowCallable c , ArgNodeEx arg , ParamNodeEx p , Ap ap
21962183 ) {
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
22012188 )
22022189 }
22032190
@@ -2282,7 +2269,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
22822269 // flow through a callable
22832270 exists ( DataFlowCall call , ParamNodeEx p , Ap innerReturnAp |
22842271 revFlowThrough ( call , returnCtx , p , state , _, returnAp , ap , innerReturnAp ) and
2285- flowThroughIntoCall ( call , node , p , _ , ap , innerReturnAp )
2272+ flowThroughIntoCall ( call , node , p , ap , innerReturnAp )
22862273 )
22872274 or
22882275 // flow out of a callable
@@ -2424,10 +2411,13 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
24242411 private predicate revFlowParamToReturn (
24252412 ParamNodeEx p , FlowState state , ReturnPosition pos , Ap returnAp , Ap ap
24262413 ) {
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+ )
24312421 }
24322422
24332423 pragma [ nomagic]
@@ -2517,13 +2507,21 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
25172507 }
25182508
25192509 pragma [ nomagic]
2520- predicate parameterMayFlowThrough ( ParamNodeEx p , Ap ap ) {
2510+ private predicate parameterMayFlowThroughAp ( ParamNodeEx p , Ap ap ) {
25212511 exists ( ReturnPosition pos |
25222512 returnFlowsThrough ( _, pos , _, _, p , _, ap , _, _, _) and
25232513 parameterFlowsThroughRev ( p , ap , pos , _)
25242514 )
25252515 }
25262516
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+
25272525 pragma [ nomagic]
25282526 private predicate nodeMayUseSummary0 ( NodeEx n , ParamNodeEx p , FlowState state , Ap ap ) {
25292527 exists ( Ap ap0 |
@@ -2540,7 +2538,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
25402538 pragma [ nomagic]
25412539 additional predicate nodeMayUseSummary ( NodeEx n , FlowState state , Ap ap ) {
25422540 exists ( ParamNodeEx p |
2543- parameterMayFlowThrough ( p , ap ) and
2541+ parameterMayFlowThroughAp ( p , ap ) and
25442542 nodeMayUseSummary0 ( n , p , state , ap )
25452543 )
25462544 }
@@ -2561,7 +2559,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
25612559 ) {
25622560 exists ( ParamNodeEx p , Ap innerReturnAp |
25632561 revFlowThrough ( call , returnCtx , p , state , _, returnAp , ap , innerReturnAp ) and
2564- flowThroughIntoCall ( call , arg , p , _ , ap , innerReturnAp )
2562+ flowThroughIntoCall ( call , arg , p , ap , innerReturnAp )
25652563 )
25662564 }
25672565
@@ -2574,17 +2572,13 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
25742572 }
25752573
25762574 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
25792576 ) {
2580- exists ( FlowState state |
2577+ exists ( FlowState state , Ap ap |
25812578 flowIntoCallAp ( call , c , arg , p , ap ) and
25822579 revFlow ( arg , pragma [ only_bind_into ] ( state ) , pragma [ only_bind_into ] ( ap ) ) and
25832580 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
25882582 |
25892583 // both directions are needed for flow-through
25902584 RevTypeFlowInput:: dataFlowTakenCallEdgeIn ( call , c , _) or
@@ -2606,7 +2600,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
26062600 }
26072601
26082602 predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) {
2609- callEdgeArgParam ( call , c , _, _, _, _ )
2603+ callEdgeArgParam ( call , c , _, _, _)
26102604 }
26112605
26122606 predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) {
@@ -2702,7 +2696,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
27022696 apNext = ap and
27032697 ap instanceof ApNil
27042698 or
2705- callEdgeArgParam ( _, _, node , next , _, ap ) and
2699+ callEdgeArgParam ( _, _, node , next , _) and
27062700 apNext = ap
27072701 or
27082702 callEdgeReturn ( _, _, node , _, next , _) and
0 commit comments