Skip to content

Commit cb84b55

Browse files
committed
Data flow: Track parameter instead of parameter position
Reverts 70d2a0d.
1 parent 99286fb commit cb84b55

File tree

2 files changed

+49
-55
lines changed

2 files changed

+49
-55
lines changed

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll

Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,8 +1327,8 @@ private module MkStage<StageSig PrevStage> {
13271327
*/
13281328
pragma[nomagic]
13291329
additional predicate fwdFlow(
1330-
NodeEx node, FlowState state, Cc cc, ParameterPositionOption summaryCtx, ApOption argAp,
1331-
Ap ap, ApApprox apa, Configuration config
1330+
NodeEx node, FlowState state, Cc cc, ParamNodeOption summaryCtx, ApOption argAp, Ap ap,
1331+
ApApprox apa, Configuration config
13321332
) {
13331333
fwdFlow0(node, state, cc, summaryCtx, argAp, ap, apa, config) and
13341334
PrevStage::revFlow(node, state, apa, config) and
@@ -1337,21 +1337,21 @@ private module MkStage<StageSig PrevStage> {
13371337

13381338
pragma[inline]
13391339
additional predicate fwdFlow(
1340-
NodeEx node, FlowState state, Cc cc, ParameterPositionOption summaryCtx, ApOption argAp,
1341-
Ap ap, Configuration config
1340+
NodeEx node, FlowState state, Cc cc, ParamNodeOption summaryCtx, ApOption argAp, Ap ap,
1341+
Configuration config
13421342
) {
13431343
fwdFlow(node, state, cc, summaryCtx, argAp, ap, _, config)
13441344
}
13451345

13461346
pragma[nomagic]
13471347
private predicate fwdFlow0(
1348-
NodeEx node, FlowState state, Cc cc, ParameterPositionOption summaryCtx, ApOption argAp,
1349-
Ap ap, ApApprox apa, Configuration config
1348+
NodeEx node, FlowState state, Cc cc, ParamNodeOption summaryCtx, ApOption argAp, Ap ap,
1349+
ApApprox apa, Configuration config
13501350
) {
13511351
sourceNode(node, state, config) and
13521352
(if hasSourceCallCtx(config) then cc = ccSomeCall() else cc = ccNone()) and
13531353
argAp = apNone() and
1354-
summaryCtx = TParameterPositionNone() and
1354+
summaryCtx = TParamNodeNone() and
13551355
ap = getApNil(node) and
13561356
apa = getApprox(ap)
13571357
or
@@ -1372,15 +1372,15 @@ private module MkStage<StageSig PrevStage> {
13721372
fwdFlow(mid, pragma[only_bind_into](state), _, _, _, ap, apa, pragma[only_bind_into](config)) and
13731373
jumpStep(mid, node, config) and
13741374
cc = ccNone() and
1375-
summaryCtx = TParameterPositionNone() and
1375+
summaryCtx = TParamNodeNone() and
13761376
argAp = apNone()
13771377
)
13781378
or
13791379
exists(NodeEx mid, ApNil nil |
13801380
fwdFlow(mid, state, _, _, _, nil, pragma[only_bind_into](config)) and
13811381
additionalJumpStep(mid, node, config) and
13821382
cc = ccNone() and
1383-
summaryCtx = TParameterPositionNone() and
1383+
summaryCtx = TParamNodeNone() and
13841384
argAp = apNone() and
13851385
ap = getApNil(node) and
13861386
apa = getApprox(ap)
@@ -1390,7 +1390,7 @@ private module MkStage<StageSig PrevStage> {
13901390
fwdFlow(mid, state0, _, _, _, nil, pragma[only_bind_into](config)) and
13911391
additionalJumpStateStep(mid, state0, node, state, config) and
13921392
cc = ccNone() and
1393-
summaryCtx = TParameterPositionNone() and
1393+
summaryCtx = TParamNodeNone() and
13941394
argAp = apNone() and
13951395
ap = getApNil(node) and
13961396
apa = getApprox(ap)
@@ -1414,10 +1414,10 @@ private module MkStage<StageSig PrevStage> {
14141414
fwdFlowIn(_, node, state, _, cc, _, _, ap, apa, config) and
14151415
if PrevStage::parameterMayFlowThrough(node, apa, config)
14161416
then (
1417-
summaryCtx = TParameterPositionSome(node.(ParamNodeEx).getPosition()) and
1417+
summaryCtx = TParamNodeSome(node.asNode()) and
14181418
argAp = apSome(ap)
14191419
) else (
1420-
summaryCtx = TParameterPositionNone() and argAp = apNone()
1420+
summaryCtx = TParamNodeNone() and argAp = apNone()
14211421
)
14221422
or
14231423
// flow out of a callable
@@ -1433,7 +1433,7 @@ private module MkStage<StageSig PrevStage> {
14331433
)
14341434
or
14351435
// flow through a callable
1436-
exists(DataFlowCall call, ParameterPosition summaryCtx0, Ap argAp0 |
1436+
exists(DataFlowCall call, ParamNodeEx summaryCtx0, Ap argAp0 |
14371437
fwdFlowOutFromArg(call, node, state, summaryCtx0, argAp0, ap, apa, config) and
14381438
fwdFlowIsEntered(call, cc, summaryCtx, argAp, summaryCtx0, argAp0, config)
14391439
)
@@ -1442,7 +1442,7 @@ private module MkStage<StageSig PrevStage> {
14421442
pragma[nomagic]
14431443
private predicate fwdFlowStore(
14441444
NodeEx node1, Ap ap1, TypedContent tc, NodeEx node2, FlowState state, Cc cc,
1445-
ParameterPositionOption summaryCtx, ApOption argAp, Configuration config
1445+
ParamNodeOption summaryCtx, ApOption argAp, Configuration config
14461446
) {
14471447
exists(DataFlowType contentType, ApApprox apa1 |
14481448
fwdFlow(node1, state, cc, summaryCtx, argAp, ap1, apa1, config) and
@@ -1473,8 +1473,8 @@ private module MkStage<StageSig PrevStage> {
14731473

14741474
pragma[nomagic]
14751475
private predicate fwdFlowRead0(
1476-
NodeEx node1, FlowState state, Cc cc, ParameterPositionOption summaryCtx, ApOption argAp,
1477-
ApNonNil ap, Configuration config
1476+
NodeEx node1, FlowState state, Cc cc, ParamNodeOption summaryCtx, ApOption argAp, ApNonNil ap,
1477+
Configuration config
14781478
) {
14791479
fwdFlow(node1, state, cc, summaryCtx, argAp, ap, config) and
14801480
PrevStage::readStepCand(node1, _, _, config)
@@ -1483,7 +1483,7 @@ private module MkStage<StageSig PrevStage> {
14831483
pragma[nomagic]
14841484
private predicate fwdFlowRead(
14851485
Ap ap, Content c, NodeEx node1, NodeEx node2, FlowState state, Cc cc,
1486-
ParameterPositionOption summaryCtx, ApOption argAp, Configuration config
1486+
ParamNodeOption summaryCtx, ApOption argAp, Configuration config
14871487
) {
14881488
fwdFlowRead0(node1, state, cc, summaryCtx, argAp, ap, config) and
14891489
PrevStage::readStepCand(node1, c, node2, config) and
@@ -1493,7 +1493,7 @@ private module MkStage<StageSig PrevStage> {
14931493
pragma[nomagic]
14941494
private predicate fwdFlowIn(
14951495
DataFlowCall call, ParamNodeEx p, FlowState state, Cc outercc, CcCall innercc,
1496-
ParameterPositionOption summaryCtx, ApOption argAp, Ap ap, ApApprox apa, Configuration config
1496+
ParamNodeOption summaryCtx, ApOption argAp, Ap ap, ApApprox apa, Configuration config
14971497
) {
14981498
exists(ArgNodeEx arg, boolean allowsFieldFlow |
14991499
fwdFlow(arg, state, outercc, summaryCtx, argAp, ap, apa, config) and
@@ -1505,23 +1505,22 @@ private module MkStage<StageSig PrevStage> {
15051505

15061506
pragma[nomagic]
15071507
private predicate fwdFlowRetFromArg(
1508-
RetNodeEx ret, FlowState state, CcCall ccc, ParameterPosition summaryCtx, ParamNodeEx p,
1509-
Ap argAp, ApApprox argApa, Ap ap, ApApprox apa, Configuration config
1508+
RetNodeEx ret, FlowState state, CcCall ccc, ParamNodeEx summaryCtx, Ap argAp, ApApprox argApa,
1509+
Ap ap, ApApprox apa, Configuration config
15101510
) {
1511-
exists(DataFlowCallable c, ReturnKindExt kind |
1511+
exists(ReturnKindExt kind |
15121512
fwdFlow(pragma[only_bind_into](ret), state, ccc,
1513-
TParameterPositionSome(pragma[only_bind_into](summaryCtx)), apSome(argAp), ap, apa, config) and
1513+
TParamNodeSome(pragma[only_bind_into](summaryCtx.asNode())), apSome(argAp), ap, apa,
1514+
config) and
15141515
getApprox(argAp) = argApa and
1515-
c = ret.getEnclosingCallable() and
15161516
kind = ret.getKind() and
1517-
p.isParameterOf(c, pragma[only_bind_into](summaryCtx)) and
1518-
parameterFlowThroughAllowed(p, kind)
1517+
parameterFlowThroughAllowed(summaryCtx, kind)
15191518
)
15201519
}
15211520

15221521
pragma[inline]
15231522
private predicate fwdFlowInMayFlowThrough(
1524-
DataFlowCall call, Cc cc, CcCall innerCc, ParameterPositionOption summaryCtx, ApOption argAp,
1523+
DataFlowCall call, Cc cc, CcCall innerCc, ParamNodeOption summaryCtx, ApOption argAp,
15251524
ParamNodeEx param, Ap ap, ApApprox apa, Configuration config
15261525
) {
15271526
fwdFlowIn(call, pragma[only_bind_into](param), _, cc, innerCc, summaryCtx, argAp, ap,
@@ -1553,13 +1552,12 @@ private module MkStage<StageSig PrevStage> {
15531552

15541553
pragma[nomagic]
15551554
private predicate fwdFlowOutFromArg(
1556-
DataFlowCall call, NodeEx out, FlowState state, ParameterPosition summaryCtx, Ap argAp, Ap ap,
1555+
DataFlowCall call, NodeEx out, FlowState state, ParamNodeEx summaryCtx, Ap argAp, Ap ap,
15571556
ApApprox apa, Configuration config
15581557
) {
15591558
exists(RetNodeEx ret, boolean allowsFieldFlow, CcCall ccc, ApApprox argApa |
15601559
fwdFlowRetFromArg(pragma[only_bind_into](ret), state, pragma[only_bind_into](ccc),
1561-
summaryCtx, _, argAp, pragma[only_bind_into](argApa), ap, pragma[only_bind_into](apa),
1562-
config) and
1560+
summaryCtx, argAp, pragma[only_bind_into](argApa), ap, pragma[only_bind_into](apa), config) and
15631561
fwdFlowThroughOutOfCall(call, ccc, ret, out, allowsFieldFlow, argApa, apa, config) and
15641562
(if allowsFieldFlow = false then ap instanceof ApNil else any())
15651563
)
@@ -1571,13 +1569,10 @@ private module MkStage<StageSig PrevStage> {
15711569
*/
15721570
pragma[nomagic]
15731571
private predicate fwdFlowIsEntered(
1574-
DataFlowCall call, Cc cc, ParameterPositionOption summaryCtx, ApOption argAp,
1575-
ParameterPosition pos, Ap ap, Configuration config
1572+
DataFlowCall call, Cc cc, ParamNodeOption summaryCtx, ApOption argAp, ParamNodeEx p, Ap ap,
1573+
Configuration config
15761574
) {
1577-
exists(ParamNodeEx param |
1578-
fwdFlowInMayFlowThrough(call, cc, _, summaryCtx, argAp, param, ap, _, config) and
1579-
pos = param.getPosition()
1580-
)
1575+
fwdFlowInMayFlowThrough(call, cc, _, summaryCtx, argAp, p, ap, _, config)
15811576
}
15821577

15831578
pragma[nomagic]
@@ -1602,8 +1597,8 @@ private module MkStage<StageSig PrevStage> {
16021597
Ap ap, Configuration config
16031598
) {
16041599
exists(boolean allowsFieldFlow, ApApprox argApa, ApApprox apa |
1605-
fwdFlowRetFromArg(pragma[only_bind_into](ret), state, pragma[only_bind_into](ccc), _, p,
1606-
argAp, pragma[only_bind_into](argApa), ap, pragma[only_bind_into](apa), config) and
1600+
fwdFlowRetFromArg(pragma[only_bind_into](ret), state, pragma[only_bind_into](ccc), p, argAp,
1601+
pragma[only_bind_into](argApa), ap, pragma[only_bind_into](apa), config) and
16071602
kind = ret.getKind() and
16081603
fwdFlowThroughOutOfCall(_, ccc, ret, _, allowsFieldFlow, argApa, apa, config) and
16091604
(if allowsFieldFlow = false then ap instanceof ApNil else any())
@@ -1967,8 +1962,9 @@ private module MkStage<StageSig PrevStage> {
19671962
conscand = count(TypedContent f0, Ap ap | fwdConsCand(f0, ap, config)) and
19681963
states = count(FlowState state | fwdFlow(_, state, _, _, _, _, config)) and
19691964
tuples =
1970-
count(NodeEx n, FlowState state, Cc cc, ParameterPositionOption summaryCtx, ApOption argAp,
1971-
Ap ap | fwdFlow(n, state, cc, summaryCtx, argAp, ap, config))
1965+
count(NodeEx n, FlowState state, Cc cc, ParamNodeOption summaryCtx, ApOption argAp, Ap ap |
1966+
fwdFlow(n, state, cc, summaryCtx, argAp, ap, config)
1967+
)
19721968
or
19731969
fwd = false and
19741970
nodes = count(NodeEx node | revFlow(node, _, _, _, _, config)) and
@@ -2823,13 +2819,12 @@ private Configuration unbindConf(Configuration conf) {
28232819

28242820
pragma[nomagic]
28252821
private predicate nodeMayUseSummary0(
2826-
NodeEx n, DataFlowCallable c, ParameterPosition pos, FlowState state, AccessPathApprox apa,
2827-
Configuration config
2822+
NodeEx n, ParamNodeEx p, FlowState state, AccessPathApprox apa, Configuration config
28282823
) {
28292824
exists(AccessPathApprox apa0 |
2830-
c = n.getEnclosingCallable() and
2825+
Stage5::parameterMayFlowThrough(p, _, _) and
28312826
Stage5::revFlow(n, state, TReturnCtxMaybeFlowThrough(_), _, apa0, config) and
2832-
Stage5::fwdFlow(n, state, any(CallContextCall ccc), TParameterPositionSome(pos),
2827+
Stage5::fwdFlow(n, state, any(CallContextCall ccc), TParamNodeSome(p.asNode()),
28332828
TAccessPathApproxSome(apa), apa0, config)
28342829
)
28352830
}
@@ -2838,10 +2833,9 @@ pragma[nomagic]
28382833
private predicate nodeMayUseSummary(
28392834
NodeEx n, FlowState state, AccessPathApprox apa, Configuration config
28402835
) {
2841-
exists(DataFlowCallable c, ParameterPosition pos, ParamNodeEx p |
2836+
exists(ParamNodeEx p |
28422837
Stage5::parameterMayFlowThrough(p, apa, config) and
2843-
nodeMayUseSummary0(n, c, pos, state, apa, config) and
2844-
p.isParameterOf(c, pos)
2838+
nodeMayUseSummary0(n, p, state, apa, config)
28452839
)
28462840
}
28472841

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -916,9 +916,9 @@ private module Cached {
916916
TDataFlowCallSome(DataFlowCall call)
917917

918918
cached
919-
newtype TParameterPositionOption =
920-
TParameterPositionNone() or
921-
TParameterPositionSome(ParameterPosition pos)
919+
newtype TParamNodeOption =
920+
TParamNodeNone() or
921+
TParamNodeSome(ParamNode p)
922922

923923
cached
924924
newtype TReturnCtx =
@@ -1343,15 +1343,15 @@ class DataFlowCallOption extends TDataFlowCallOption {
13431343
}
13441344
}
13451345

1346-
/** An optional `ParameterPosition`. */
1347-
class ParameterPositionOption extends TParameterPositionOption {
1346+
/** An optional `ParamNode`. */
1347+
class ParamNodeOption extends TParamNodeOption {
13481348
string toString() {
1349-
this = TParameterPositionNone() and
1349+
this = TParamNodeNone() and
13501350
result = "(none)"
13511351
or
1352-
exists(ParameterPosition pos |
1353-
this = TParameterPositionSome(pos) and
1354-
result = pos.toString()
1352+
exists(ParamNode p |
1353+
this = TParamNodeSome(p) and
1354+
result = p.toString()
13551355
)
13561356
}
13571357
}

0 commit comments

Comments
 (0)