Skip to content

Commit c8046fa

Browse files
committed
Dataflow: Drop some ApApprox columns and joins.
1 parent 80be95d commit c8046fa

File tree

1 file changed

+48
-65
lines changed

1 file changed

+48
-65
lines changed

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

Lines changed: 48 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -942,11 +942,9 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
942942
}
943943

944944
pragma[nomagic]
945-
predicate returnMayFlowThrough(RetNodeEx ret, Ap argAp, Ap ap, ReturnKindExt kind) {
945+
predicate returnMayFlowThrough(RetNodeEx ret, ReturnKindExt kind) {
946946
throughFlowNodeCand(ret) and
947-
kind = ret.getKind() and
948-
exists(argAp) and
949-
exists(ap)
947+
kind = ret.getKind()
950948
}
951949

952950
pragma[nomagic]
@@ -969,19 +967,18 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
969967

970968
predicate callEdgeReturn(
971969
DataFlowCall call, DataFlowCallable c, RetNodeEx ret, ReturnKindExt kind, NodeEx out,
972-
boolean allowsFieldFlow, Ap ap
970+
boolean allowsFieldFlow
973971
) {
974972
flowOutOfCallNodeCand1(call, ret, kind, out, allowsFieldFlow) and
975-
c = ret.getEnclosingCallable() and
976-
exists(ap)
973+
c = ret.getEnclosingCallable()
977974
}
978975

979976
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c) {
980977
callEdgeArgParam(call, c, _, _, _, _)
981978
}
982979

983980
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
984-
callEdgeReturn(call, c, _, _, _, _, _)
981+
callEdgeReturn(call, c, _, _, _, _)
985982
}
986983

987984
additional predicate stats(
@@ -1004,7 +1001,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
10041001
calledges =
10051002
count(DataFlowCall call, DataFlowCallable c |
10061003
callEdgeArgParam(call, c, _, _, _, _) or
1007-
callEdgeReturn(call, c, _, _, _, _, _)
1004+
callEdgeReturn(call, c, _, _, _, _)
10081005
)
10091006
}
10101007
/* End: Stage 1 logic. */
@@ -1287,7 +1284,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
12871284

12881285
predicate parameterMayFlowThrough(ParamNodeEx p, Ap ap);
12891286

1290-
predicate returnMayFlowThrough(RetNodeEx ret, Ap argAp, Ap ap, ReturnKindExt kind);
1287+
predicate returnMayFlowThrough(RetNodeEx ret, ReturnKindExt kind);
12911288

12921289
predicate storeStepCand(
12931290
NodeEx node1, Ap ap1, Content c, NodeEx node2, DataFlowType contentType,
@@ -1303,7 +1300,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
13031300

13041301
predicate callEdgeReturn(
13051302
DataFlowCall call, DataFlowCallable c, RetNodeEx ret, ReturnKindExt kind, NodeEx out,
1306-
boolean allowsFieldFlow, Ap ap
1303+
boolean allowsFieldFlow
13071304
);
13081305

13091306
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c);
@@ -1437,13 +1434,12 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
14371434

14381435
pragma[nomagic]
14391436
private predicate flowThroughOutOfCall(
1440-
DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow,
1441-
ApApprox argApa, ApApprox apa
1437+
DataFlowCall call, CcCall ccc, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow
14421438
) {
14431439
exists(ReturnKindExt kind |
1444-
PrevStage::callEdgeReturn(call, _, ret, kind, out, allowsFieldFlow, apa) and
1440+
PrevStage::callEdgeReturn(call, _, ret, kind, out, allowsFieldFlow) and
14451441
PrevStage::callMayFlowThroughRev(call) and
1446-
PrevStage::returnMayFlowThrough(ret, argApa, apa, kind) and
1442+
PrevStage::returnMayFlowThrough(ret, kind) and
14471443
matchesCall(ccc, call)
14481444
)
14491445
}
@@ -1560,12 +1556,9 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
15601556
fwdFlowOut(_, _, node, state, cc, summaryCtx, t, ap, apa, stored)
15611557
or
15621558
// flow through a callable
1563-
exists(
1564-
DataFlowCall call, CcCall ccc, RetNodeEx ret, boolean allowsFieldFlow,
1565-
ApApprox innerArgApa
1566-
|
1567-
fwdFlowThrough(call, cc, state, ccc, summaryCtx, t, ap, apa, stored, ret, innerArgApa) and
1568-
flowThroughOutOfCall(call, ccc, ret, node, allowsFieldFlow, innerArgApa, apa) and
1559+
exists(DataFlowCall call, CcCall ccc, RetNodeEx ret, boolean allowsFieldFlow |
1560+
fwdFlowThrough(call, cc, state, ccc, summaryCtx, t, ap, apa, stored, ret, _) and
1561+
flowThroughOutOfCall(call, ccc, ret, node, allowsFieldFlow) and
15691562
not inBarrier(node, state) and
15701563
if allowsFieldFlow = false then ap instanceof ApNil else any()
15711564
)
@@ -1925,7 +1918,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
19251918
DataFlowCallable c, CcNoCall ctx
19261919
) {
19271920
result = viableImplCallContextReducedReverse(c, ctx) and
1928-
PrevStage::callEdgeReturn(result, c, _, _, _, _, _)
1921+
PrevStage::callEdgeReturn(result, c, _, _, _, _)
19291922
}
19301923

19311924
bindingset[c, ctx]
@@ -1939,21 +1932,20 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
19391932
bindingset[call]
19401933
pragma[inline_late]
19411934
private predicate flowOutOfCallApaInlineLate(
1942-
DataFlowCall call, DataFlowCallable c, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow,
1943-
ApApprox apa
1935+
DataFlowCall call, DataFlowCallable c, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow
19441936
) {
1945-
PrevStage::callEdgeReturn(call, c, ret, _, out, allowsFieldFlow, apa)
1937+
PrevStage::callEdgeReturn(call, c, ret, _, out, allowsFieldFlow)
19461938
}
19471939

1948-
bindingset[c, ret, apa, innercc]
1940+
bindingset[c, ret, innercc]
19491941
pragma[inline_late]
19501942
pragma[noopt]
19511943
private predicate flowOutOfCallApaNotCallContextReduced(
19521944
DataFlowCall call, DataFlowCallable c, RetNodeEx ret, NodeEx out, boolean allowsFieldFlow,
1953-
ApApprox apa, CcNoCall innercc
1945+
CcNoCall innercc
19541946
) {
19551947
viableImplNotCallContextReducedReverse(innercc) and
1956-
PrevStage::callEdgeReturn(call, c, ret, _, out, allowsFieldFlow, apa)
1948+
PrevStage::callEdgeReturn(call, c, ret, _, out, allowsFieldFlow)
19571949
}
19581950

19591951
pragma[nomagic]
@@ -1975,10 +1967,9 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
19751967
inner = ret.getEnclosingCallable() and
19761968
(
19771969
call = viableImplCallContextReducedReverseInlineLate(inner, innercc) and
1978-
flowOutOfCallApaInlineLate(call, inner, ret, out, allowsFieldFlow, apa)
1970+
flowOutOfCallApaInlineLate(call, inner, ret, out, allowsFieldFlow)
19791971
or
1980-
flowOutOfCallApaNotCallContextReduced(call, inner, ret, out, allowsFieldFlow, apa,
1981-
innercc)
1972+
flowOutOfCallApaNotCallContextReduced(call, inner, ret, out, allowsFieldFlow, innercc)
19821973
)
19831974
}
19841975

@@ -2050,10 +2041,8 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
20502041
private predicate fwdFlow1Out(
20512042
NodeEx node, FlowState state, Cc cc, Typ t0, Ap ap, TypOption stored
20522043
) {
2053-
exists(ApApprox apa |
2054-
fwdFlow1(node, state, cc, _, t0, _, ap, apa, stored) and
2055-
PrevStage::callEdgeReturn(_, _, _, _, node, _, apa)
2056-
)
2044+
fwdFlow1(node, state, cc, _, t0, _, ap, _, stored) and
2045+
PrevStage::callEdgeReturn(_, _, _, _, node, _)
20572046
}
20582047

20592048
pragma[nomagic]
@@ -2097,15 +2086,14 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
20972086
) {
20982087
exists(ReturnKindExt kind, ParamNodeEx p, Ap argAp |
20992088
instanceofCcCall(ccc) and
2100-
fwdFlow(pragma[only_bind_into](ret), state, ccc, summaryCtx, t, ap,
2101-
pragma[only_bind_into](apa), stored) and
2089+
fwdFlow(pragma[only_bind_into](ret), state, ccc, summaryCtx, t, ap, apa, stored) and
21022090
summaryCtx =
21032091
TSummaryCtxSome(pragma[only_bind_into](p), _, _, pragma[only_bind_into](argAp), _) and
21042092
not outBarrier(ret, state) and
21052093
kind = ret.getKind() and
21062094
parameterFlowThroughAllowed(p, kind) and
21072095
argApa = getApprox(argAp) and
2108-
PrevStage::returnMayFlowThrough(ret, pragma[only_bind_into](argApa), apa, kind)
2096+
PrevStage::returnMayFlowThrough(ret, kind)
21092097
)
21102098
}
21112099

@@ -2178,10 +2166,10 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
21782166
RetNodeEx ret, ReturnPosition pos, FlowState state, CcCall ccc, ParamNodeEx p, Typ argT,
21792167
Ap argAp, ApApprox argApa, TypOption argStored, Ap ap
21802168
) {
2181-
exists(DataFlowCall call, ApApprox apa, boolean allowsFieldFlow |
2182-
returnFlowsThrough0(call, state, ccc, ap, apa, ret,
2169+
exists(DataFlowCall call, boolean allowsFieldFlow |
2170+
returnFlowsThrough0(call, state, ccc, ap, _, ret,
21832171
TSummaryCtxSome(p, _, argT, argAp, argStored), argApa) and
2184-
flowThroughOutOfCall(call, ccc, ret, _, allowsFieldFlow, argApa, apa) and
2172+
flowThroughOutOfCall(call, ccc, ret, _, allowsFieldFlow) and
21852173
pos = ret.getReturnPosition() and
21862174
if allowsFieldFlow = false then ap instanceof ApNil else any()
21872175
)
@@ -2216,14 +2204,13 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
22162204
pragma[nomagic]
22172205
private predicate flowOutOfCallAp(
22182206
DataFlowCall call, DataFlowCallable c, RetNodeEx ret, ReturnPosition pos, NodeEx out,
2219-
Ap ap
2207+
Ap ap, boolean allowsFieldFlow
22202208
) {
2221-
exists(ApApprox apa, boolean allowsFieldFlow |
2222-
PrevStage::callEdgeReturn(call, c, ret, _, out, allowsFieldFlow, apa) and
2223-
fwdFlow(ret, _, _, _, _, ap, apa, _) and
2224-
pos = ret.getReturnPosition() and
2225-
if allowsFieldFlow = false then ap instanceof ApNil else any()
2226-
|
2209+
PrevStage::callEdgeReturn(call, c, ret, _, out, allowsFieldFlow) and
2210+
fwdFlow(ret, _, _, _, _, ap, _, _) and
2211+
pos = ret.getReturnPosition() and
2212+
(if allowsFieldFlow = false then ap instanceof ApNil else any()) and
2213+
(
22272214
// both directions are needed for flow-through
22282215
FwdTypeFlowInput::dataFlowTakenCallEdgeIn(call, c, _) or
22292216
FwdTypeFlowInput::dataFlowTakenCallEdgeOut(call, c)
@@ -2356,7 +2343,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
23562343
predicate enableTypeFlow = Param::enableTypeFlow/0;
23572344

23582345
predicate relevantCallEdgeIn(DataFlowCall call, DataFlowCallable c) {
2359-
flowOutOfCallAp(call, c, _, _, _, _)
2346+
flowOutOfCallAp(call, c, _, _, _, _, _)
23602347
}
23612348

23622349
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
@@ -2407,7 +2394,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
24072394
DataFlowCall call, RetNodeEx ret, ReturnPosition pos, NodeEx out, Ap ap, boolean cc
24082395
) {
24092396
exists(DataFlowCallable c |
2410-
flowOutOfCallAp(call, c, ret, pos, out, ap) and
2397+
flowOutOfCallAp(call, c, ret, pos, out, ap, _) and
24112398
RevTypeFlow::typeFlowValidEdgeIn(call, c, cc)
24122399
)
24132400
}
@@ -2559,8 +2546,8 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
25592546
}
25602547

25612548
pragma[nomagic]
2562-
predicate returnMayFlowThrough(RetNodeEx ret, Ap argAp, Ap ap, ReturnKindExt kind) {
2563-
exists(ParamNodeEx p, ReturnPosition pos |
2549+
predicate returnMayFlowThrough(RetNodeEx ret, ReturnKindExt kind) {
2550+
exists(ParamNodeEx p, ReturnPosition pos, Ap argAp, Ap ap |
25642551
returnFlowsThrough(ret, pos, _, _, p, _, argAp, _, _, ap) and
25652552
parameterFlowsThroughRev(p, argAp, pos, ap) and
25662553
kind = pos.getKind()
@@ -2607,14 +2594,13 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
26072594

26082595
predicate callEdgeReturn(
26092596
DataFlowCall call, DataFlowCallable c, RetNodeEx ret, ReturnKindExt kind, NodeEx out,
2610-
boolean allowsFieldFlow, Ap ap
2597+
boolean allowsFieldFlow
26112598
) {
2612-
exists(FlowState state, ReturnPosition pos |
2613-
flowOutOfCallAp(call, c, ret, pos, out, ap) and
2599+
exists(FlowState state, ReturnPosition pos, Ap ap |
2600+
flowOutOfCallAp(call, c, ret, pos, out, ap, allowsFieldFlow) and
26142601
revFlow(ret, pragma[only_bind_into](state), pragma[only_bind_into](ap)) and
26152602
revFlow(out, pragma[only_bind_into](state), pragma[only_bind_into](ap)) and
26162603
kind = pos.getKind() and
2617-
allowsFieldFlow = true and
26182604
RevTypeFlowInput::dataFlowTakenCallEdgeIn(call, c, _)
26192605
)
26202606
}
@@ -2624,7 +2610,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
26242610
}
26252611

26262612
predicate relevantCallEdgeOut(DataFlowCall call, DataFlowCallable c) {
2627-
callEdgeReturn(call, c, _, _, _, _, _)
2613+
callEdgeReturn(call, c, _, _, _, _)
26282614
}
26292615

26302616
/** Holds if `node1` can step to `node2` in one or more local steps. */
@@ -2719,7 +2705,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
27192705
callEdgeArgParam(_, _, node, next, _, ap) and
27202706
apNext = ap
27212707
or
2722-
callEdgeReturn(_, _, node, _, next, _, ap) and
2708+
callEdgeReturn(_, _, node, _, next, _) and
27232709
apNext = ap
27242710
or
27252711
storeStepCand(node, _, _, next, _, _)
@@ -3206,13 +3192,10 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
32063192
PathNodeImpl pn1, PathNodeImpl pn2, PathNodeImpl pn3, NodeEx node, Cc cc,
32073193
FlowState state, SummaryCtx summaryCtx, Typ t, Ap ap, TypOption stored
32083194
) {
3209-
exists(
3210-
DataFlowCall call, CcCall ccc, RetNodeEx ret, boolean allowsFieldFlow,
3211-
ApApprox innerArgApa, ApApprox apa
3212-
|
3213-
fwdFlowThroughStep1(pn1, pn2, pn3, call, cc, state, ccc, summaryCtx, t, ap, apa,
3214-
stored, ret, innerArgApa) and
3215-
flowThroughOutOfCall(call, ccc, ret, node, allowsFieldFlow, innerArgApa, apa) and
3195+
exists(DataFlowCall call, CcCall ccc, RetNodeEx ret, boolean allowsFieldFlow |
3196+
fwdFlowThroughStep1(pn1, pn2, pn3, call, cc, state, ccc, summaryCtx, t, ap, _, stored,
3197+
ret, _) and
3198+
flowThroughOutOfCall(call, ccc, ret, node, allowsFieldFlow) and
32163199
not inBarrier(node, state) and
32173200
if allowsFieldFlow = false then ap instanceof ApNil else any()
32183201
)

0 commit comments

Comments
 (0)