@@ -207,18 +207,6 @@ private predicate fullBarrier(Node node, Configuration config) {
207
207
)
208
208
}
209
209
210
- private class AdditionalFlowStepSource extends Node {
211
- AdditionalFlowStepSource ( ) { any ( Configuration c ) .isAdditionalFlowStep ( this , _) }
212
- }
213
-
214
- pragma [ noinline]
215
- private predicate isAdditionalFlowStep (
216
- AdditionalFlowStepSource node1 , Node node2 , DataFlowCallable callable1 , Configuration config
217
- ) {
218
- config .isAdditionalFlowStep ( node1 , node2 ) and
219
- callable1 = node1 .getEnclosingCallable ( )
220
- }
221
-
222
210
/**
223
211
* Holds if data can flow in one local step from `node1` to `node2`.
224
212
*/
@@ -237,7 +225,8 @@ private predicate localFlowStep(Node node1, Node node2, Configuration config) {
237
225
* Holds if the additional step from `node1` to `node2` does not jump between callables.
238
226
*/
239
227
private predicate additionalLocalFlowStep ( Node node1 , Node node2 , Configuration config ) {
240
- isAdditionalFlowStep ( node1 , node2 , node2 .getEnclosingCallable ( ) , config ) and
228
+ config .isAdditionalFlowStep ( node1 , node2 ) and
229
+ getNodeEnclosingCallable ( node1 ) = getNodeEnclosingCallable ( node2 ) and
241
230
not outBarrier ( node1 , config ) and
242
231
not inBarrier ( node2 , config ) and
243
232
not fullBarrier ( node1 , config ) and
@@ -259,14 +248,12 @@ private predicate jumpStep(Node node1, Node node2, Configuration config) {
259
248
* Holds if the additional step from `node1` to `node2` jumps between callables.
260
249
*/
261
250
private predicate additionalJumpStep ( Node node1 , Node node2 , Configuration config ) {
262
- exists ( DataFlowCallable callable1 |
263
- isAdditionalFlowStep ( node1 , node2 , callable1 , config ) and
264
- node2 .getEnclosingCallable ( ) != callable1 and
265
- not outBarrier ( node1 , config ) and
266
- not inBarrier ( node2 , config ) and
267
- not fullBarrier ( node1 , config ) and
268
- not fullBarrier ( node2 , config )
269
- )
251
+ config .isAdditionalFlowStep ( node1 , node2 ) and
252
+ getNodeEnclosingCallable ( node1 ) != getNodeEnclosingCallable ( node2 ) and
253
+ not outBarrier ( node1 , config ) and
254
+ not inBarrier ( node2 , config ) and
255
+ not fullBarrier ( node1 , config ) and
256
+ not fullBarrier ( node2 , config )
270
257
}
271
258
272
259
/**
@@ -601,7 +588,7 @@ private module Stage1 {
601
588
) {
602
589
exists ( ReturnNodeExt ret |
603
590
throughFlowNodeCand ( ret , config ) and
604
- callable = ret . getEnclosingCallable ( ) and
591
+ callable = getNodeEnclosingCallable ( ret ) and
605
592
kind = ret .getKind ( )
606
593
)
607
594
}
@@ -614,7 +601,7 @@ private module Stage1 {
614
601
exists ( ReturnKindExt kind |
615
602
throughFlowNodeCand ( p , config ) and
616
603
returnFlowCallableNodeCand ( c , kind , config ) and
617
- p . getEnclosingCallable ( ) = c and
604
+ getNodeEnclosingCallable ( p ) = c and
618
605
exists ( ap ) and
619
606
// we don't expect a parameter to return stored in itself
620
607
not exists ( int pos |
@@ -778,7 +765,7 @@ private module Stage2 {
778
765
bindingset [ result , ap]
779
766
private ApApprox getApprox ( Ap ap ) { any ( ) }
780
767
781
- private ApNil getApNil ( Node node ) { any ( ) }
768
+ private ApNil getApNil ( Node node ) { PrevStage :: revFlow ( node , _ ) and exists ( result ) }
782
769
783
770
bindingset [ tc, tail]
784
771
private Ap apCons ( TypedContent tc , Ap tail ) { result = true and exists ( tc ) and exists ( tail ) }
@@ -966,7 +953,7 @@ private module Stage2 {
966
953
exists ( ArgumentNode arg , boolean allowsFieldFlow |
967
954
fwdFlow ( arg , outercc , argAp , ap , config ) and
968
955
flowIntoCall ( call , arg , p , allowsFieldFlow , config ) and
969
- innercc = getCallContextCall ( call , p . getEnclosingCallable ( ) , outercc )
956
+ innercc = getCallContextCall ( call , getNodeEnclosingCallable ( p ) , outercc )
970
957
|
971
958
ap instanceof ApNil or allowsFieldFlow = true
972
959
)
@@ -985,7 +972,7 @@ private module Stage2 {
985
972
exists ( ReturnNodeExt ret , boolean allowsFieldFlow , DataFlowCallable inner |
986
973
fwdFlow ( ret , innercc , argAp , ap , config ) and
987
974
flowOutOfCall ( call , ret , out , allowsFieldFlow , config ) and
988
- inner = ret . getEnclosingCallable ( ) and
975
+ inner = getNodeEnclosingCallable ( ret ) and
989
976
checkCallContextReturn ( innercc , inner , call ) and
990
977
ccOut = getCallContextReturn ( inner , call )
991
978
|
@@ -1216,13 +1203,13 @@ private module Stage2 {
1216
1203
ParameterNode p , Ap ap , Ap ap0 , DataFlowCallable c , Configuration config
1217
1204
) {
1218
1205
revFlow ( p , true , apSome ( ap0 ) , ap , config ) and
1219
- c = p . getEnclosingCallable ( )
1206
+ c = getNodeEnclosingCallable ( p )
1220
1207
}
1221
1208
1222
1209
predicate parameterMayFlowThrough ( ParameterNode p , DataFlowCallable c , Ap ap , Configuration config ) {
1223
1210
exists ( ReturnNodeExt ret , Ap ap0 , ReturnKindExt kind , int pos |
1224
1211
parameterFlow ( p , ap , ap0 , c , config ) and
1225
- c = ret . getEnclosingCallable ( ) and
1212
+ c = getNodeEnclosingCallable ( ret ) and
1226
1213
revFlow ( ret , true , apSome ( _) , ap0 , config ) and
1227
1214
fwdFlow ( ret , any ( CcCall ccc ) , apSome ( ap ) , ap0 , config ) and
1228
1215
kind = ret .getKind ( ) and
@@ -1348,7 +1335,7 @@ private module LocalFlowBigStep {
1348
1335
t = getNodeType ( node2 )
1349
1336
) and
1350
1337
node1 != node2 and
1351
- cc .relevantFor ( node1 . getEnclosingCallable ( ) ) and
1338
+ cc .relevantFor ( getNodeEnclosingCallable ( node1 ) ) and
1352
1339
not isUnreachableInCall ( node1 , cc .( LocalCallContextSpecificCall ) .getCall ( ) ) and
1353
1340
Stage2:: revFlow ( node2 , unbind ( config ) )
1354
1341
or
@@ -1397,7 +1384,9 @@ private module Stage3 {
1397
1384
1398
1385
private ApApprox getApprox ( Ap ap ) { result = ap .toBoolNonEmpty ( ) }
1399
1386
1400
- private ApNil getApNil ( Node node ) { result = TFrontNil ( getNodeType ( node ) ) }
1387
+ private ApNil getApNil ( Node node ) {
1388
+ PrevStage:: revFlow ( node , _) and result = TFrontNil ( getNodeType ( node ) )
1389
+ }
1401
1390
1402
1391
bindingset [ tc, tail]
1403
1392
private Ap apCons ( TypedContent tc , Ap tail ) { result .getHead ( ) = tc and exists ( tail ) }
@@ -1594,7 +1583,7 @@ private module Stage3 {
1594
1583
exists ( ArgumentNode arg , boolean allowsFieldFlow |
1595
1584
fwdFlow ( arg , outercc , argAp , ap , config ) and
1596
1585
flowIntoCall ( call , arg , p , allowsFieldFlow , config ) and
1597
- innercc = getCallContextCall ( call , p . getEnclosingCallable ( ) , outercc )
1586
+ innercc = getCallContextCall ( call , getNodeEnclosingCallable ( p ) , outercc )
1598
1587
|
1599
1588
ap instanceof ApNil or allowsFieldFlow = true
1600
1589
)
@@ -1613,7 +1602,7 @@ private module Stage3 {
1613
1602
exists ( ReturnNodeExt ret , boolean allowsFieldFlow , DataFlowCallable inner |
1614
1603
fwdFlow ( ret , innercc , argAp , ap , config ) and
1615
1604
flowOutOfCall ( call , ret , out , allowsFieldFlow , config ) and
1616
- inner = ret . getEnclosingCallable ( ) and
1605
+ inner = getNodeEnclosingCallable ( ret ) and
1617
1606
checkCallContextReturn ( innercc , inner , call ) and
1618
1607
ccOut = getCallContextReturn ( inner , call )
1619
1608
|
@@ -1844,13 +1833,13 @@ private module Stage3 {
1844
1833
ParameterNode p , Ap ap , Ap ap0 , DataFlowCallable c , Configuration config
1845
1834
) {
1846
1835
revFlow ( p , true , apSome ( ap0 ) , ap , config ) and
1847
- c = p . getEnclosingCallable ( )
1836
+ c = getNodeEnclosingCallable ( p )
1848
1837
}
1849
1838
1850
1839
predicate parameterMayFlowThrough ( ParameterNode p , DataFlowCallable c , Ap ap , Configuration config ) {
1851
1840
exists ( ReturnNodeExt ret , Ap ap0 , ReturnKindExt kind , int pos |
1852
1841
parameterFlow ( p , ap , ap0 , c , config ) and
1853
- c = ret . getEnclosingCallable ( ) and
1842
+ c = getNodeEnclosingCallable ( ret ) and
1854
1843
revFlow ( ret , true , apSome ( _) , ap0 , config ) and
1855
1844
fwdFlow ( ret , any ( CcCall ccc ) , apSome ( ap ) , ap0 , config ) and
1856
1845
kind = ret .getKind ( ) and
@@ -2090,7 +2079,9 @@ private module Stage4 {
2090
2079
2091
2080
private ApApprox getApprox ( Ap ap ) { result = ap .getFront ( ) }
2092
2081
2093
- private ApNil getApNil ( Node node ) { result = TNil ( getNodeType ( node ) ) }
2082
+ private ApNil getApNil ( Node node ) {
2083
+ PrevStage:: revFlow ( node , _) and result = TNil ( getNodeType ( node ) )
2084
+ }
2094
2085
2095
2086
bindingset [ tc, tail]
2096
2087
private Ap apCons ( TypedContent tc , Ap tail ) { result = push ( tc , tail ) }
@@ -2135,7 +2126,7 @@ private module Stage4 {
2135
2126
bindingset [ node, cc, config]
2136
2127
private LocalCc getLocalCc ( Node node , Cc cc , Configuration config ) {
2137
2128
localFlowEntry ( node , config ) and
2138
- result = getLocalCallContext ( cc , node . getEnclosingCallable ( ) )
2129
+ result = getLocalCallContext ( cc , getNodeEnclosingCallable ( node ) )
2139
2130
}
2140
2131
2141
2132
private predicate localStep (
@@ -2300,7 +2291,7 @@ private module Stage4 {
2300
2291
exists ( ArgumentNode arg , boolean allowsFieldFlow |
2301
2292
fwdFlow ( arg , outercc , argAp , ap , config ) and
2302
2293
flowIntoCall ( call , arg , p , allowsFieldFlow , config ) and
2303
- innercc = getCallContextCall ( call , p . getEnclosingCallable ( ) , outercc )
2294
+ innercc = getCallContextCall ( call , getNodeEnclosingCallable ( p ) , outercc )
2304
2295
|
2305
2296
ap instanceof ApNil or allowsFieldFlow = true
2306
2297
)
@@ -2319,7 +2310,7 @@ private module Stage4 {
2319
2310
exists ( ReturnNodeExt ret , boolean allowsFieldFlow , DataFlowCallable inner |
2320
2311
fwdFlow ( ret , innercc , argAp , ap , config ) and
2321
2312
flowOutOfCall ( call , ret , out , allowsFieldFlow , config ) and
2322
- inner = ret . getEnclosingCallable ( ) and
2313
+ inner = getNodeEnclosingCallable ( ret ) and
2323
2314
checkCallContextReturn ( innercc , inner , call ) and
2324
2315
ccOut = getCallContextReturn ( inner , call )
2325
2316
|
@@ -2550,13 +2541,13 @@ private module Stage4 {
2550
2541
ParameterNode p , Ap ap , Ap ap0 , DataFlowCallable c , Configuration config
2551
2542
) {
2552
2543
revFlow ( p , true , apSome ( ap0 ) , ap , config ) and
2553
- c = p . getEnclosingCallable ( )
2544
+ c = getNodeEnclosingCallable ( p )
2554
2545
}
2555
2546
2556
2547
predicate parameterMayFlowThrough ( ParameterNode p , DataFlowCallable c , Ap ap , Configuration config ) {
2557
2548
exists ( ReturnNodeExt ret , Ap ap0 , ReturnKindExt kind , int pos |
2558
2549
parameterFlow ( p , ap , ap0 , c , config ) and
2559
- c = ret . getEnclosingCallable ( ) and
2550
+ c = getNodeEnclosingCallable ( ret ) and
2560
2551
revFlow ( ret , true , apSome ( _) , ap0 , config ) and
2561
2552
fwdFlow ( ret , any ( CcCall ccc ) , apSome ( ap ) , ap0 , config ) and
2562
2553
kind = ret .getKind ( ) and
@@ -2590,7 +2581,7 @@ private predicate nodeMayUseSummary(Node n, AccessPathApprox apa, Configuration
2590
2581
Stage4:: parameterMayFlowThrough ( _, c , apa , _) and
2591
2582
Stage4:: revFlow ( n , true , _, apa0 , config ) and
2592
2583
Stage4:: fwdFlow ( n , any ( CallContextCall ccc ) , TAccessPathApproxSome ( apa ) , apa0 , config ) and
2593
- n . getEnclosingCallable ( ) = c
2584
+ getNodeEnclosingCallable ( n ) = c
2594
2585
)
2595
2586
}
2596
2587
@@ -3119,7 +3110,7 @@ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, SummaryCt
3119
3110
conf = mid .getConfiguration ( ) and
3120
3111
cc = mid .getCallContext ( ) and
3121
3112
sc = mid .getSummaryCtx ( ) and
3122
- localCC = getLocalCallContext ( cc , midnode . getEnclosingCallable ( ) ) and
3113
+ localCC = getLocalCallContext ( cc , getNodeEnclosingCallable ( midnode ) ) and
3123
3114
ap0 = mid .getAp ( )
3124
3115
|
3125
3116
localFlowBigStep ( midnode , node , true , _, conf , localCC ) and
@@ -3405,22 +3396,22 @@ private module FlowExploration {
3405
3396
// flow out of a callable
3406
3397
viableReturnPosOut ( _, getReturnPosition ( node1 ) , node2 )
3407
3398
|
3408
- c1 = node1 . getEnclosingCallable ( ) and
3409
- c2 = node2 . getEnclosingCallable ( ) and
3399
+ c1 = getNodeEnclosingCallable ( node1 ) and
3400
+ c2 = getNodeEnclosingCallable ( node2 ) and
3410
3401
c1 != c2
3411
3402
)
3412
3403
}
3413
3404
3414
3405
private predicate interestingCallableSrc ( DataFlowCallable c , Configuration config ) {
3415
- exists ( Node n | config .isSource ( n ) and c = n . getEnclosingCallable ( ) )
3406
+ exists ( Node n | config .isSource ( n ) and c = getNodeEnclosingCallable ( n ) )
3416
3407
or
3417
3408
exists ( DataFlowCallable mid |
3418
3409
interestingCallableSrc ( mid , config ) and callableStep ( mid , c , config )
3419
3410
)
3420
3411
}
3421
3412
3422
3413
private predicate interestingCallableSink ( DataFlowCallable c , Configuration config ) {
3423
- exists ( Node n | config .isSink ( n ) and c = n . getEnclosingCallable ( ) )
3414
+ exists ( Node n | config .isSink ( n ) and c = getNodeEnclosingCallable ( n ) )
3424
3415
or
3425
3416
exists ( DataFlowCallable mid |
3426
3417
interestingCallableSink ( mid , config ) and callableStep ( c , mid , config )
@@ -3449,13 +3440,13 @@ private module FlowExploration {
3449
3440
exists ( Node n , Configuration config |
3450
3441
ce1 = TCallableSrc ( ) and
3451
3442
config .isSource ( n ) and
3452
- ce2 = TCallable ( n . getEnclosingCallable ( ) , config )
3443
+ ce2 = TCallable ( getNodeEnclosingCallable ( n ) , config )
3453
3444
)
3454
3445
or
3455
3446
exists ( Node n , Configuration config |
3456
3447
ce2 = TCallableSink ( ) and
3457
3448
config .isSink ( n ) and
3458
- ce1 = TCallable ( n . getEnclosingCallable ( ) , config )
3449
+ ce1 = TCallable ( getNodeEnclosingCallable ( n ) , config )
3459
3450
)
3460
3451
}
3461
3452
@@ -3586,7 +3577,7 @@ private module FlowExploration {
3586
3577
exists ( config .explorationLimit ( ) )
3587
3578
or
3588
3579
partialPathNodeMk0 ( node , cc , sc1 , sc2 , ap , config ) and
3589
- distSrc ( node . getEnclosingCallable ( ) , config ) <= config .explorationLimit ( )
3580
+ distSrc ( getNodeEnclosingCallable ( node ) , config ) <= config .explorationLimit ( )
3590
3581
} or
3591
3582
TPartialPathNodeRev (
3592
3583
Node node , TRevSummaryCtx1 sc1 , TRevSummaryCtx2 sc2 , RevPartialAccessPath ap ,
@@ -3603,7 +3594,7 @@ private module FlowExploration {
3603
3594
revPartialPathStep ( mid , node , sc1 , sc2 , ap , config ) and
3604
3595
not clearsContent ( node , ap .getHead ( ) ) and
3605
3596
not fullBarrier ( node , config ) and
3606
- distSink ( node . getEnclosingCallable ( ) , config ) <= config .explorationLimit ( )
3597
+ distSink ( getNodeEnclosingCallable ( node ) , config ) <= config .explorationLimit ( )
3607
3598
)
3608
3599
}
3609
3600
@@ -3662,15 +3653,15 @@ private module FlowExploration {
3662
3653
* of interprocedural steps.
3663
3654
*/
3664
3655
int getSourceDistance ( ) {
3665
- result = distSrc ( this .getNode ( ) . getEnclosingCallable ( ) , this .getConfiguration ( ) )
3656
+ result = distSrc ( getNodeEnclosingCallable ( this .getNode ( ) ) , this .getConfiguration ( ) )
3666
3657
}
3667
3658
3668
3659
/**
3669
3660
* Gets the approximate distance to the nearest sink measured in number
3670
3661
* of interprocedural steps.
3671
3662
*/
3672
3663
int getSinkDistance ( ) {
3673
- result = distSink ( this .getNode ( ) . getEnclosingCallable ( ) , this .getConfiguration ( ) )
3664
+ result = distSink ( getNodeEnclosingCallable ( this .getNode ( ) ) , this .getConfiguration ( ) )
3674
3665
}
3675
3666
3676
3667
private string ppAp ( ) {
0 commit comments