Skip to content

Commit 5ed89fd

Browse files
committed
DataFlowEx refactor
1 parent c66f6ca commit 5ed89fd

File tree

2 files changed

+101
-75
lines changed

2 files changed

+101
-75
lines changed

shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
647647
// inline to reduce the number of iterations
648648
pragma[inline]
649649
private predicate fwdFlowIn(DataFlowCallEx call, NodeEx arg, Cc cc, ParamNodeEx p) {
650-
exists(DataFlowCall underlyingCall | underlyingCall = call.asDataFlowCall(_) |
650+
exists(DataFlowCall underlyingCall | underlyingCall = call.projectToCall() |
651651
// call context cannot help reduce virtual dispatch
652652
fwdFlow(arg, cc) and
653653
viableParamArgEx(call, p, arg) and
@@ -680,7 +680,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
680680
) {
681681
fwdFlow(arg, true) and
682682
viableParamArgEx(call, p, arg) and
683-
CachedCallContextSensitivity::reducedViableImplInCallContext(call.asDataFlowCall(_), _, _) and
683+
CachedCallContextSensitivity::reducedViableImplInCallContext(call.projectToCall(), _, _) and
684684
target = p.getEnclosingCallable() and
685685
not fullBarrier(p)
686686
}
@@ -694,7 +694,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
694694
private DataFlowCallable viableImplInSomeFwdFlowCallContextExt(DataFlowCall call) {
695695
exists(DataFlowCallEx ctx |
696696
fwdFlowIsEntered(ctx, _) and
697-
result = viableImplInCallContextExt(call, ctx.asDataFlowCall(_))
697+
result = viableImplInCallContextExt(call, ctx.projectToCall())
698698
)
699699
}
700700

@@ -1246,7 +1246,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
12461246
DataFlowCall ctx
12471247
) {
12481248
returnCallEdge1(c, scope, call, out) and
1249-
c = viableImplInCallContextExt(call.asDataFlowCall(_), ctx)
1249+
c = viableImplInCallContextExt(call.projectToCall(), ctx)
12501250
}
12511251

12521252
private int ctxDispatchFanoutOnReturn(NodeEx out, DataFlowCallEx ctx) {
@@ -1255,10 +1255,10 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
12551255
not Stage1::revFlow(out, false) and
12561256
call.getEnclosingCallable() = c and
12571257
returnCallEdge1(c, _, ctx, _) and
1258-
mayBenefitFromCallContextExt(call.asDataFlowCall(_), _) and
1258+
mayBenefitFromCallContextExt(call.projectToCall(), _) and
12591259
result =
12601260
count(DataFlowCallable tgt, SndLevelScopeOption scope |
1261-
returnCallEdgeInCtx1(tgt, scope, call, out, ctx.asDataFlowCall(_))
1261+
returnCallEdgeInCtx1(tgt, scope, call, out, ctx.projectToCall())
12621262
)
12631263
)
12641264
}
@@ -1531,7 +1531,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
15311531
PrevStage::callEdgeReturn(call, _, ret, kind, out, allowsFieldFlow, apa) and
15321532
PrevStage::callMayFlowThroughRev(call) and
15331533
PrevStage::returnMayFlowThrough(ret, argApa, apa, kind) and
1534-
matchesCall(ccc, call.asDataFlowCall(_))
1534+
matchesCall(ccc, call.projectToCall())
15351535
)
15361536
}
15371537

@@ -1860,7 +1860,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
18601860
private DataFlowCallable viableImplCallContextReducedRestricted(
18611861
DataFlowCallEx call, CcCall ctx
18621862
) {
1863-
result = viableImplCallContextReduced(call.asDataFlowCall(_), ctx) and
1863+
result = viableImplCallContextReduced(call.projectToCall(), ctx) and
18641864
callEdgeArgParamRestricted(call, result, _, _, _, _)
18651865
}
18661866

@@ -1905,7 +1905,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
19051905
) {
19061906
callEdgeArgParamRestricted(call, _, arg, _, _, _) and
19071907
instanceofCc(outercc) and
1908-
viableImplNotCallContextReducedInlineLate(call.asDataFlowCall(_), outercc)
1908+
viableImplNotCallContextReducedInlineLate(call.projectToCall(), outercc)
19091909
}
19101910

19111911
pragma[inline]
@@ -1949,7 +1949,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
19491949
DataFlowCallEx call, DataFlowCallable inner, CcCall innercc, boolean cc
19501950
) {
19511951
not enableTypeFlow() and
1952-
FwdTypeFlow::typeFlowValidEdgeIn(call.asDataFlowCall(_), inner, cc) and
1952+
FwdTypeFlow::typeFlowValidEdgeIn(call.projectToCall(), inner, cc) and
19531953
innercc = getCallContextCall(call, inner)
19541954
}
19551955

@@ -1959,7 +1959,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
19591959
CcCall innercc, boolean emptyAp, ApApprox apa, boolean cc
19601960
) {
19611961
fwdFlowInCandTypeFlowEnabled(call, arg, outercc, inner, p, emptyAp, apa, cc) and
1962-
FwdTypeFlow::typeFlowValidEdgeIn(call.asDataFlowCall(_), inner, cc) and
1962+
FwdTypeFlow::typeFlowValidEdgeIn(call.projectToCall(), inner, cc) and
19631963
innercc = getCallContextCall(call, inner)
19641964
}
19651965

@@ -2011,7 +2011,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
20112011
private DataFlowCallEx viableImplCallContextReducedReverseRestricted(
20122012
DataFlowCallable c, CcNoCall ctx
20132013
) {
2014-
result.asDataFlowCall(_) = viableImplCallContextReducedReverse(c, ctx) and
2014+
result.projectToCall() = viableImplCallContextReducedReverse(c, ctx) and
20152015
PrevStage::callEdgeReturn(result, c, _, _, _, _, _)
20162016
}
20172017

@@ -2075,7 +2075,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
20752075
CcNoCall outercc, ApApprox apa, boolean allowsFieldFlow
20762076
) {
20772077
fwdFlowOutCand(call, ret, innercc, inner, out, apa, allowsFieldFlow) and
2078-
FwdTypeFlow::typeFlowValidEdgeOut(call.asDataFlowCall(_), inner) and
2078+
FwdTypeFlow::typeFlowValidEdgeOut(call.projectToCall(), inner) and
20792079
outercc = getCallContextReturn(inner, call)
20802080
}
20812081

@@ -2096,23 +2096,23 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
20962096
predicate enableTypeFlow = Param::enableTypeFlow/0;
20972097

20982098
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c) {
2099-
PrevStage::relevantCallEdgeIn(MkDataFlowCallEx(call, _), c)
2099+
PrevStage::relevantCallEdgeIn(injectCall(call), c)
21002100
}
21012101

21022102
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
2103-
PrevStage::relevantCallEdgeOut(MkDataFlowCallEx(call, _), c)
2103+
PrevStage::relevantCallEdgeOut(injectCall(call), c)
21042104
}
21052105

21062106
pragma[nomagic]
21072107
private predicate dataFlowTakenCallEdgeIn0(
21082108
DataFlowCall call, DataFlowCallable c, ParamNodeEx p, FlowState state, CcCall innercc,
21092109
Typ t, Ap ap, TypOption stored, boolean cc
21102110
) {
2111-
FwdFlowInNoThrough::fwdFlowIn(MkDataFlowCallEx(call, _), _, c, p, state, _, innercc, _,
2112-
t, ap, _, stored, cc)
2111+
FwdFlowInNoThrough::fwdFlowIn(injectCall(call), _, c, p, state, _, innercc, _, t, ap, _,
2112+
stored, cc)
21132113
or
2114-
FwdFlowInThrough::fwdFlowIn(MkDataFlowCallEx(call, _), _, c, p, state, _, innercc, _, t,
2115-
ap, _, stored, cc)
2114+
FwdFlowInThrough::fwdFlowIn(injectCall(call), _, c, p, state, _, innercc, _, t, ap, _,
2115+
stored, cc)
21162116
}
21172117

21182118
pragma[nomagic]
@@ -2136,7 +2136,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
21362136
DataFlowCall call, DataFlowCallable c, NodeEx node, FlowState state, Cc cc, Typ t,
21372137
Ap ap, TypOption stored
21382138
) {
2139-
fwdFlowOut(MkDataFlowCallEx(call, _), c, node, state, cc, _, t, ap, _, stored)
2139+
fwdFlowOut(injectCall(call), c, node, state, cc, _, t, ap, _, stored)
21402140
}
21412141

21422142
pragma[nomagic]
@@ -2180,7 +2180,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
21802180
boolean allowsFieldFlow, ApApprox apa
21812181
) {
21822182
PrevStage::callEdgeArgParam(call, c, arg, p, allowsFieldFlow, apa) and
2183-
FwdTypeFlowInput::dataFlowTakenCallEdgeIn(call.asDataFlowCall(_), c, _)
2183+
FwdTypeFlowInput::dataFlowTakenCallEdgeIn(call.projectToCall(), c, _)
21842184
}
21852185

21862186
pragma[nomagic]
@@ -2319,8 +2319,8 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
23192319
if allowsFieldFlow = false then ap instanceof ApNil else any()
23202320
|
23212321
// both directions are needed for flow-through
2322-
FwdTypeFlowInput::dataFlowTakenCallEdgeIn(call.asDataFlowCall(_), c, _) or
2323-
FwdTypeFlowInput::dataFlowTakenCallEdgeOut(call.asDataFlowCall(_), c)
2322+
FwdTypeFlowInput::dataFlowTakenCallEdgeIn(call.projectToCall(), c, _) or
2323+
FwdTypeFlowInput::dataFlowTakenCallEdgeOut(call.projectToCall(), c)
23242324
)
23252325
}
23262326

@@ -2450,24 +2450,24 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
24502450
predicate enableTypeFlow = Param::enableTypeFlow/0;
24512451

24522452
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c) {
2453-
flowOutOfCallAp(MkDataFlowCallEx(call, _), c, _, _, _, _)
2453+
flowOutOfCallAp(injectCall(call), c, _, _, _, _)
24542454
}
24552455

24562456
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
2457-
flowIntoCallAp(MkDataFlowCallEx(call, _), c, _, _, _)
2457+
flowIntoCallAp(injectCall(call), c, _, _, _)
24582458
}
24592459

24602460
pragma[nomagic]
24612461
predicate dataFlowTakenCallEdgeIn(DataFlowCall call, DataFlowCallable c, boolean cc) {
24622462
exists(RetNodeEx ret |
2463-
revFlowOut(MkDataFlowCallEx(call, _), ret, _, _, _, cc, _, _) and
2463+
revFlowOut(injectCall(call), ret, _, _, _, cc, _, _) and
24642464
c = ret.getEnclosingCallable()
24652465
)
24662466
}
24672467

24682468
pragma[nomagic]
24692469
predicate dataFlowTakenCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
2470-
revFlowIn(MkDataFlowCallEx(call, _), c, _, _, _)
2470+
revFlowIn(injectCall(call), c, _, _, _)
24712471
}
24722472

24732473
predicate dataFlowNonCallEntry(DataFlowCallable c, boolean cc) {
@@ -2493,7 +2493,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
24932493
DataFlowCallEx call, DataFlowCallable c, ArgNodeEx arg, ParamNodeEx p, Ap ap
24942494
) {
24952495
flowIntoCallAp(call, c, arg, p, ap) and
2496-
RevTypeFlow::typeFlowValidEdgeOut(call.asDataFlowCall(_), c)
2496+
RevTypeFlow::typeFlowValidEdgeOut(call.projectToCall(), c)
24972497
}
24982498

24992499
pragma[nomagic]
@@ -2502,7 +2502,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
25022502
) {
25032503
exists(DataFlowCallable c |
25042504
flowOutOfCallAp(call, c, ret, pos, out, ap) and
2505-
RevTypeFlow::typeFlowValidEdgeIn(call.asDataFlowCall(_), c, cc)
2505+
RevTypeFlow::typeFlowValidEdgeIn(call.projectToCall(), c, cc)
25062506
)
25072507
}
25082508

@@ -2558,7 +2558,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
25582558
exists(RetNodeEx ret, FlowState state, CcCall ccc |
25592559
revFlowOut(call, ret, pos, state, returnCtx, _, returnAp, ap) and
25602560
returnFlowsThrough(ret, pos, state, ccc, _, _, _, _, _, ap) and
2561-
matchesCall(ccc, call.asDataFlowCall(_))
2561+
matchesCall(ccc, call.projectToCall())
25622562
)
25632563
}
25642564

@@ -2694,8 +2694,8 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
26942694
allowsFieldFlow = true
26952695
|
26962696
// both directions are needed for flow-through
2697-
RevTypeFlowInput::dataFlowTakenCallEdgeIn(call.asDataFlowCall(_), c, _) or
2698-
RevTypeFlowInput::dataFlowTakenCallEdgeOut(call.asDataFlowCall(_), c)
2697+
RevTypeFlowInput::dataFlowTakenCallEdgeIn(call.projectToCall(), c, _) or
2698+
RevTypeFlowInput::dataFlowTakenCallEdgeOut(call.projectToCall(), c)
26992699
)
27002700
}
27012701

@@ -2709,7 +2709,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
27092709
revFlow(out, pragma[only_bind_into](state), pragma[only_bind_into](ap)) and
27102710
kind = pos.getKind() and
27112711
allowsFieldFlow = true and
2712-
RevTypeFlowInput::dataFlowTakenCallEdgeIn(call.asDataFlowCall(_), c, _)
2712+
RevTypeFlowInput::dataFlowTakenCallEdgeIn(call.projectToCall(), c, _)
27132713
)
27142714
}
27152715

@@ -3932,11 +3932,11 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
39323932

39333933
private module CallContextSensitivityInput implements CallContextSensitivityInputSig {
39343934
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c) {
3935-
PrevStage::relevantCallEdgeIn(MkDataFlowCallEx(call, _), c)
3935+
PrevStage::relevantCallEdgeIn(injectCall(call), c)
39363936
}
39373937

39383938
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
3939-
PrevStage::relevantCallEdgeOut(MkDataFlowCallEx(call, _), c)
3939+
PrevStage::relevantCallEdgeOut(injectCall(call), c)
39403940
}
39413941

39423942
predicate reducedViableImplInCallContextCand =
@@ -4336,11 +4336,11 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
43364336

43374337
private module CallContextSensitivityInput implements CallContextSensitivityInputSig {
43384338
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c) {
4339-
PrevStage::relevantCallEdgeIn(MkDataFlowCallEx(call, _), c)
4339+
PrevStage::relevantCallEdgeIn(injectCall(call), c)
43404340
}
43414341

43424342
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
4343-
PrevStage::relevantCallEdgeOut(MkDataFlowCallEx(call, _), c)
4343+
PrevStage::relevantCallEdgeOut(injectCall(call), c)
43444344
}
43454345

43464346
predicate reducedViableImplInCallContextCand =
@@ -4536,11 +4536,11 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
45364536

45374537
private module CallContextSensitivityInput implements CallContextSensitivityInputSig {
45384538
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c) {
4539-
PrevStage::relevantCallEdgeIn(MkDataFlowCallEx(call, _), c)
4539+
PrevStage::relevantCallEdgeIn(injectCall(call), c)
45404540
}
45414541

45424542
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
4543-
PrevStage::relevantCallEdgeOut(MkDataFlowCallEx(call, _), c)
4543+
PrevStage::relevantCallEdgeOut(injectCall(call), c)
45444544
}
45454545

45464546
predicate reducedViableImplInCallContextCand =
@@ -5553,7 +5553,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
55535553
partialPathOutOfCallable0(mid, pos, state, innercc, t, ap) and
55545554
c = pos.getCallable() and
55555555
kind = pos.getKind() and
5556-
CachedCallContextSensitivity::resolveReturn(innercc, c, call.asDataFlowCall(_)) and
5556+
CachedCallContextSensitivity::resolveReturn(innercc, c, call.projectToCall()) and
55575557
cc = CachedCallContextSensitivity::getCallContextReturn(c, call)
55585558
)
55595559
}
@@ -5590,7 +5590,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
55905590
CallContext outercc, DataFlowCallEx call, DataFlowType t, PartialAccessPath ap
55915591
) {
55925592
partialPathIntoArg(mid, pos, state, outercc, call, t, ap) and
5593-
callable = CachedCallContextSensitivity::resolveCall(call.asDataFlowCall(_), outercc)
5593+
callable = CachedCallContextSensitivity::resolveCall(call.projectToCall(), outercc)
55945594
}
55955595

55965596
private predicate partialPathIntoCallable(

0 commit comments

Comments
 (0)