Skip to content

Commit 7c888eb

Browse files
committed
Dataflow: Replace some allowsFieldFlow,apa pairs with emptyAp boolean.
1 parent c8046fa commit 7c888eb

File tree

1 file changed

+68
-74
lines changed

1 file changed

+68
-74
lines changed

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

Lines changed: 68 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)