@@ -588,7 +588,7 @@ module MakeImpl<InputSig Lang> {
588
588
cc = false
589
589
or
590
590
cc = true and
591
- not reducedViableImplInCallContext ( call , _, _)
591
+ not CachedCallContextSensitivity :: reducedViableImplInCallContext ( call , _, _)
592
592
)
593
593
or
594
594
// call context may help reduce virtual dispatch
@@ -611,7 +611,7 @@ module MakeImpl<InputSig Lang> {
611
611
) {
612
612
fwdFlow ( arg , true ) and
613
613
viableParamArgEx ( call , p , arg ) and
614
- reducedViableImplInCallContext ( call , _, _) and
614
+ CachedCallContextSensitivity :: reducedViableImplInCallContext ( call , _, _) and
615
615
target = p .getEnclosingCallable ( ) and
616
616
not fullBarrier ( p )
617
617
}
@@ -982,6 +982,14 @@ module MakeImpl<InputSig Lang> {
982
982
exists ( ap )
983
983
}
984
984
985
+ predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) {
986
+ callEdgeArgParam ( call , c , _, _, _, _)
987
+ }
988
+
989
+ predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) {
990
+ callEdgeReturn ( call , c , _, _, _, _, _)
991
+ }
992
+
985
993
additional predicate stats (
986
994
boolean fwd , int nodes , int fields , int conscand , int states , int tuples , int calledges
987
995
) {
@@ -1178,6 +1186,10 @@ module MakeImpl<InputSig Lang> {
1178
1186
DataFlowCall call , DataFlowCallable c , RetNodeEx ret , ReturnKindExt kind , NodeEx out ,
1179
1187
boolean allowsFieldFlow , Ap ap
1180
1188
) ;
1189
+
1190
+ predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) ;
1191
+
1192
+ predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) ;
1181
1193
}
1182
1194
1183
1195
private module MkStage< StageSig PrevStage> {
@@ -1219,7 +1231,9 @@ module MakeImpl<InputSig Lang> {
1219
1231
1220
1232
ApOption apSome ( Ap ap ) ;
1221
1233
1222
- class Cc ;
1234
+ class Cc {
1235
+ string toString ( ) ;
1236
+ }
1223
1237
1224
1238
class CcCall extends Cc ;
1225
1239
@@ -1731,13 +1745,9 @@ module MakeImpl<InputSig Lang> {
1731
1745
private module FwdTypeFlowInput implements TypeFlowInput {
1732
1746
predicate enableTypeFlow = Param:: enableTypeFlow / 0 ;
1733
1747
1734
- predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) {
1735
- PrevStage:: callEdgeArgParam ( call , c , _, _, _, _)
1736
- }
1748
+ predicate relevantCallEdgeIn = PrevStage:: relevantCallEdgeIn / 2 ;
1737
1749
1738
- predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) {
1739
- PrevStage:: callEdgeReturn ( call , c , _, _, _, _, _)
1740
- }
1750
+ predicate relevantCallEdgeOut = PrevStage:: relevantCallEdgeOut / 2 ;
1741
1751
1742
1752
pragma [ nomagic]
1743
1753
private predicate dataFlowTakenCallEdgeIn0 (
@@ -2314,6 +2324,14 @@ module MakeImpl<InputSig Lang> {
2314
2324
)
2315
2325
}
2316
2326
2327
+ predicate relevantCallEdgeIn ( DataFlowCall call , DataFlowCallable c ) {
2328
+ callEdgeArgParam ( call , c , _, _, _, _)
2329
+ }
2330
+
2331
+ predicate relevantCallEdgeOut ( DataFlowCall call , DataFlowCallable c ) {
2332
+ callEdgeReturn ( call , c , _, _, _, _, _)
2333
+ }
2334
+
2317
2335
additional predicate stats (
2318
2336
boolean fwd , int nodes , int fields , int conscand , int states , int tuples , int calledges ,
2319
2337
int tfnodes , int tftuples
@@ -2356,9 +2374,7 @@ module MakeImpl<InputSig Lang> {
2356
2374
}
2357
2375
2358
2376
private module BooleanCallContext {
2359
- class Cc extends boolean {
2360
- Cc ( ) { this in [ true , false ] }
2361
- }
2377
+ class Cc = Boolean ;
2362
2378
2363
2379
class CcCall extends Cc {
2364
2380
CcCall ( ) { this = true }
@@ -2398,7 +2414,24 @@ module MakeImpl<InputSig Lang> {
2398
2414
CcNoCall getCallContextReturn ( DataFlowCallable c , DataFlowCall call ) { any ( ) }
2399
2415
}
2400
2416
2401
- private module Level1CallContext {
2417
+ private signature module Level1CallContextInputSig {
2418
+ DataFlowCallable prunedViableImplInCallContext ( DataFlowCall call , CallContextSpecificCall ctx ) ;
2419
+
2420
+ bindingset [ call, ctx]
2421
+ predicate noPrunedViableImplInCallContext ( DataFlowCall call , CallContext ctx ) ;
2422
+
2423
+ predicate recordDataFlowCallSiteDispatch ( DataFlowCall call , DataFlowCallable callable ) ;
2424
+
2425
+ predicate recordDataFlowCallSiteUnreachable ( DataFlowCall call , DataFlowCallable callable ) ;
2426
+
2427
+ predicate reducedViableImplInReturn ( DataFlowCallable c , DataFlowCall call ) ;
2428
+
2429
+ DataFlowCall prunedViableImplInCallContextReverse (
2430
+ DataFlowCallable callable , CallContextReturn ctx
2431
+ ) ;
2432
+ }
2433
+
2434
+ private module Level1CallContext< Level1CallContextInputSig Input> {
2402
2435
class Cc = CallContext ;
2403
2436
2404
2437
class CcCall = CallContextCall ;
@@ -2419,17 +2452,17 @@ module MakeImpl<InputSig Lang> {
2419
2452
LocalCc getLocalCc ( NodeEx node , Cc cc ) { any ( ) }
2420
2453
2421
2454
DataFlowCallable viableImplCallContextReduced ( DataFlowCall call , CcCall ctx ) {
2422
- result = prunedViableImplInCallContext ( call , ctx )
2455
+ result = Input :: prunedViableImplInCallContext ( call , ctx )
2423
2456
}
2424
2457
2425
2458
bindingset [ call, ctx]
2426
2459
predicate viableImplNotCallContextReduced ( DataFlowCall call , Cc ctx ) {
2427
- noPrunedViableImplInCallContext ( call , ctx )
2460
+ Input :: noPrunedViableImplInCallContext ( call , ctx )
2428
2461
}
2429
2462
2430
2463
bindingset [ call, c]
2431
2464
CcCall getCallContextCall ( DataFlowCall call , DataFlowCallable c ) {
2432
- if recordDataFlowCallSiteDispatch ( call , c )
2465
+ if Input :: recordDataFlowCallSiteDispatch ( call , c )
2433
2466
then result = TSpecificCall ( call )
2434
2467
else result = TSomeCall ( )
2435
2468
}
@@ -2446,24 +2479,26 @@ module MakeImpl<InputSig Lang> {
2446
2479
}
2447
2480
2448
2481
DataFlowCallable viableImplCallContextReduced ( DataFlowCall call , CcCall ctx ) {
2449
- result = prunedViableImplInCallContext ( call , ctx )
2482
+ result = Input :: prunedViableImplInCallContext ( call , ctx )
2450
2483
}
2451
2484
2452
2485
bindingset [ call, ctx]
2453
2486
predicate viableImplNotCallContextReduced ( DataFlowCall call , Cc ctx ) {
2454
- noPrunedViableImplInCallContext ( call , ctx )
2487
+ Input :: noPrunedViableImplInCallContext ( call , ctx )
2455
2488
}
2456
2489
2457
2490
bindingset [ call, c]
2458
2491
CcCall getCallContextCall ( DataFlowCall call , DataFlowCallable c ) {
2459
- if recordDataFlowCallSite ( call , c )
2492
+ if
2493
+ Input:: recordDataFlowCallSiteDispatch ( call , c ) or
2494
+ Input:: recordDataFlowCallSiteUnreachable ( call , c )
2460
2495
then result = TSpecificCall ( call )
2461
2496
else result = TSomeCall ( )
2462
2497
}
2463
2498
}
2464
2499
2465
2500
DataFlowCallable viableImplCallContextReducedReverse ( DataFlowCall call , CcNoCall ctx ) {
2466
- call = prunedViableImplInCallContextReverse ( result , ctx )
2501
+ call = Input :: prunedViableImplInCallContextReverse ( result , ctx )
2467
2502
}
2468
2503
2469
2504
predicate viableImplNotCallContextReducedReverse ( CcNoCall ctx ) {
@@ -2472,7 +2507,9 @@ module MakeImpl<InputSig Lang> {
2472
2507
2473
2508
bindingset [ call, c]
2474
2509
CcNoCall getCallContextReturn ( DataFlowCallable c , DataFlowCall call ) {
2475
- if reducedViableImplInReturn ( c , call ) then result = TReturn ( c , call ) else result = ccNone ( )
2510
+ if Input:: reducedViableImplInReturn ( c , call )
2511
+ then result = TReturn ( c , call )
2512
+ else result = ccNone ( )
2476
2513
}
2477
2514
}
2478
2515
@@ -2510,7 +2547,11 @@ module MakeImpl<InputSig Lang> {
2510
2547
2511
2548
ApOption apSome ( Ap ap ) { result = TBooleanSome ( ap ) }
2512
2549
2513
- import Level1CallContext
2550
+ private module Level1CallContextInput implements Level1CallContextInputSig {
2551
+ import CachedCallContextSensitivity
2552
+ }
2553
+
2554
+ import Level1CallContext< Level1CallContextInput >
2514
2555
import NoLocalCallContext
2515
2556
2516
2557
bindingset [ node1, state1]
@@ -2780,7 +2821,23 @@ module MakeImpl<InputSig Lang> {
2780
2821
2781
2822
ApOption apSome ( Ap ap ) { result = TApproxAccessPathFrontSome ( ap ) }
2782
2823
2783
- import Level1CallContext
2824
+ additional module Level1CallContextInput implements Level1CallContextInputSig {
2825
+ private module CallContextSensitivityInput implements CallContextSensitivityInputSig {
2826
+ predicate relevantCallEdgeIn = PrevStage:: relevantCallEdgeIn / 2 ;
2827
+
2828
+ predicate relevantCallEdgeOut = PrevStage:: relevantCallEdgeOut / 2 ;
2829
+
2830
+ predicate reducedViableImplInCallContextCand =
2831
+ CachedCallContextSensitivity:: reducedViableImplInCallContext / 3 ;
2832
+
2833
+ predicate reducedViableImplInReturnCand =
2834
+ CachedCallContextSensitivity:: reducedViableImplInReturn / 2 ;
2835
+ }
2836
+
2837
+ import CallContextSensitivity< CallContextSensitivityInput >
2838
+ }
2839
+
2840
+ import Level1CallContext< Level1CallContextInput >
2784
2841
import NoLocalCallContext
2785
2842
2786
2843
predicate localStep (
@@ -3148,7 +3205,23 @@ module MakeImpl<InputSig Lang> {
3148
3205
3149
3206
ApOption apSome ( Ap ap ) { result = TAccessPathApproxSome ( ap ) }
3150
3207
3151
- import Level1CallContext
3208
+ additional module Level1CallContextInput implements Level1CallContextInputSig {
3209
+ private module CallContextSensitivityInput implements CallContextSensitivityInputSig {
3210
+ predicate relevantCallEdgeIn = PrevStage:: relevantCallEdgeIn / 2 ;
3211
+
3212
+ predicate relevantCallEdgeOut = PrevStage:: relevantCallEdgeOut / 2 ;
3213
+
3214
+ predicate reducedViableImplInCallContextCand =
3215
+ Stage3Param:: Level1CallContextInput:: reducedViableImplInCallContext / 3 ;
3216
+
3217
+ predicate reducedViableImplInReturnCand =
3218
+ Stage3Param:: Level1CallContextInput:: reducedViableImplInReturn / 2 ;
3219
+ }
3220
+
3221
+ import CallContextSensitivity< CallContextSensitivityInput >
3222
+ }
3223
+
3224
+ import Level1CallContext< Level1CallContextInput >
3152
3225
import LocalCallContext
3153
3226
3154
3227
predicate localStep (
@@ -4026,6 +4099,22 @@ module MakeImpl<InputSig Lang> {
4026
4099
)
4027
4100
}
4028
4101
4102
+ private module PrunedCallContextSensitivityStage5 {
4103
+ private module CallContextSensitivityInput implements CallContextSensitivityInputSig {
4104
+ predicate relevantCallEdgeIn = Stage5:: relevantCallEdgeIn / 2 ;
4105
+
4106
+ predicate relevantCallEdgeOut = Stage5:: relevantCallEdgeOut / 2 ;
4107
+
4108
+ predicate reducedViableImplInCallContextCand =
4109
+ Stage5Param:: Level1CallContextInput:: reducedViableImplInCallContext / 3 ;
4110
+
4111
+ predicate reducedViableImplInReturnCand =
4112
+ Stage5Param:: Level1CallContextInput:: reducedViableImplInReturn / 2 ;
4113
+ }
4114
+
4115
+ import CallContextSensitivity< CallContextSensitivityInput >
4116
+ }
4117
+
4029
4118
pragma [ nomagic]
4030
4119
private predicate pathOutOfCallable1 (
4031
4120
PathNodeMid mid , DataFlowCall call , ReturnKindExt kind , FlowState state , CallContext cc ,
@@ -4035,9 +4124,11 @@ module MakeImpl<InputSig Lang> {
4035
4124
pathOutOfCallable0 ( mid , pos , state , innercc , apa ) and
4036
4125
c = pos .getCallable ( ) and
4037
4126
kind = pos .getKind ( ) and
4038
- resolveReturn ( innercc , c , call )
4127
+ PrunedCallContextSensitivityStage5 :: resolveReturn ( innercc , c , call )
4039
4128
|
4040
- if reducedViableImplInReturn ( c , call ) then cc = TReturn ( c , call ) else cc = TAnyCallContext ( )
4129
+ if PrunedCallContextSensitivityStage5:: reducedViableImplInReturn ( c , call )
4130
+ then cc = TReturn ( c , call )
4131
+ else cc = TAnyCallContext ( )
4041
4132
)
4042
4133
}
4043
4134
@@ -4087,8 +4178,6 @@ module MakeImpl<InputSig Lang> {
4087
4178
)
4088
4179
}
4089
4180
4090
- private predicate parameterCandProj ( DataFlowCallable c ) { parameterCand ( c , _, _) }
4091
-
4092
4181
pragma [ nomagic]
4093
4182
private predicate pathIntoCallable0 (
4094
4183
PathNodeMid mid , DataFlowCallable callable , ParameterPosition pos , FlowState state ,
@@ -4097,7 +4186,7 @@ module MakeImpl<InputSig Lang> {
4097
4186
exists ( AccessPathApprox apa |
4098
4187
pathIntoArg ( mid , pragma [ only_bind_into ] ( pos ) , state , outercc , call , t , ap ,
4099
4188
pragma [ only_bind_into ] ( apa ) ) and
4100
- callable = ResolveCall < parameterCandProj / 1 > :: resolveCall ( call , outercc ) and
4189
+ callable = PrunedCallContextSensitivityStage5 :: resolveCall ( call , outercc ) and
4101
4190
parameterCand ( callable , pragma [ only_bind_into ] ( pos ) , pragma [ only_bind_into ] ( apa ) )
4102
4191
)
4103
4192
}
@@ -4127,7 +4216,7 @@ module MakeImpl<InputSig Lang> {
4127
4216
not Config:: getAFeature ( ) instanceof FeatureEqualSourceSinkCallContext
4128
4217
)
4129
4218
|
4130
- if recordDataFlowCallSite ( call , callable )
4219
+ if PrunedCallContextSensitivityStage5 :: recordDataFlowCallSite ( call , callable )
4131
4220
then innercc = TSpecificCall ( call )
4132
4221
else innercc = TSomeCall ( )
4133
4222
)
@@ -5019,9 +5108,9 @@ module MakeImpl<InputSig Lang> {
5019
5108
partialPathOutOfCallable0 ( mid , pos , state , innercc , t , ap ) and
5020
5109
c = pos .getCallable ( ) and
5021
5110
kind = pos .getKind ( ) and
5022
- resolveReturn ( innercc , c , call )
5111
+ CachedCallContextSensitivity :: resolveReturn ( innercc , c , call )
5023
5112
|
5024
- if reducedViableImplInReturn ( c , call )
5113
+ if CachedCallContextSensitivity :: reducedViableImplInReturn ( c , call )
5025
5114
then cc = TReturn ( c , call )
5026
5115
else cc = TAnyCallContext ( )
5027
5116
)
@@ -5054,15 +5143,13 @@ module MakeImpl<InputSig Lang> {
5054
5143
)
5055
5144
}
5056
5145
5057
- private predicate anyCallable ( DataFlowCallable c ) { any ( ) }
5058
-
5059
5146
pragma [ nomagic]
5060
5147
private predicate partialPathIntoCallable0 (
5061
5148
PartialPathNodeFwd mid , DataFlowCallable callable , ParameterPosition pos , FlowState state ,
5062
5149
CallContext outercc , DataFlowCall call , DataFlowType t , PartialAccessPath ap
5063
5150
) {
5064
5151
partialPathIntoArg ( mid , pos , state , outercc , call , t , ap ) and
5065
- callable = ResolveCall < anyCallable / 1 > :: resolveCall ( call , outercc )
5152
+ callable = CachedCallContextSensitivity :: resolveCall ( call , outercc )
5066
5153
}
5067
5154
5068
5155
private predicate partialPathIntoCallable (
@@ -5078,7 +5165,7 @@ module MakeImpl<InputSig Lang> {
5078
5165
sc3 = TSummaryCtx3Some ( t ) and
5079
5166
sc4 = TSummaryCtx4Some ( ap )
5080
5167
|
5081
- if recordDataFlowCallSite ( call , callable )
5168
+ if CachedCallContextSensitivity :: recordDataFlowCallSite ( call , callable )
5082
5169
then innercc = TSpecificCall ( call )
5083
5170
else innercc = TSomeCall ( )
5084
5171
)
0 commit comments