Skip to content

Commit a10bde5

Browse files
authored
Merge pull request #6872 from hvitved/dataflow/path-into-callable0-join
Data flow: Performance tweaks
2 parents 8e68eae + e695429 commit a10bde5

File tree

25 files changed

+600
-450
lines changed

25 files changed

+600
-450
lines changed

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3460,7 +3460,7 @@ private predicate pathStep(
34603460
exists(TypedContent tc | pathReadStep(mid, node, ap.push(tc), tc, cc)) and
34613461
sc = mid.getSummaryCtx()
34623462
or
3463-
pathIntoCallable(mid, node, _, cc, sc, _) and ap = mid.getAp()
3463+
pathIntoCallable(mid, node, _, cc, sc, _, _) and ap = mid.getAp()
34643464
or
34653465
pathOutOfCallable(mid, node, cc) and ap = mid.getAp() and sc instanceof SummaryCtxNone
34663466
or
@@ -3537,14 +3537,16 @@ private predicate pathOutOfCallable(PathNodeMid mid, NodeEx out, CallContext cc)
35373537
*/
35383538
pragma[noinline]
35393539
private predicate pathIntoArg(
3540-
PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa
3540+
PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa,
3541+
Configuration config
35413542
) {
35423543
exists(ArgNode arg |
35433544
arg = mid.getNodeEx().asNode() and
35443545
cc = mid.getCallContext() and
35453546
arg.argumentOf(call, i) and
35463547
ap = mid.getAp() and
3547-
apa = ap.getApprox()
3548+
apa = ap.getApprox() and
3549+
config = mid.getConfiguration()
35483550
)
35493551
}
35503552

@@ -3561,12 +3563,14 @@ private predicate parameterCand(
35613563
pragma[nomagic]
35623564
private predicate pathIntoCallable0(
35633565
PathNodeMid mid, DataFlowCallable callable, int i, CallContext outercc, DataFlowCall call,
3564-
AccessPath ap
3566+
AccessPath ap, Configuration config
35653567
) {
35663568
exists(AccessPathApprox apa |
3567-
pathIntoArg(mid, i, outercc, call, ap, apa) and
3569+
pathIntoArg(mid, pragma[only_bind_into](i), outercc, call, ap, pragma[only_bind_into](apa),
3570+
pragma[only_bind_into](config)) and
35683571
callable = resolveCall(call, outercc) and
3569-
parameterCand(callable, any(int j | j <= i and j >= i), apa, mid.getConfiguration())
3572+
parameterCand(callable, pragma[only_bind_into](i), pragma[only_bind_into](apa),
3573+
pragma[only_bind_into](config))
35703574
)
35713575
}
35723576

@@ -3575,12 +3579,13 @@ private predicate pathIntoCallable0(
35753579
* before and after entering the callable are `outercc` and `innercc`,
35763580
* respectively.
35773581
*/
3582+
pragma[nomagic]
35783583
private predicate pathIntoCallable(
35793584
PathNodeMid mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, SummaryCtx sc,
3580-
DataFlowCall call
3585+
DataFlowCall call, Configuration config
35813586
) {
35823587
exists(int i, DataFlowCallable callable, AccessPath ap |
3583-
pathIntoCallable0(mid, callable, i, outercc, call, ap) and
3588+
pathIntoCallable0(mid, callable, i, outercc, call, ap, config) and
35843589
p.isParameterOf(callable, i) and
35853590
(
35863591
sc = TSummaryCtxSome(p, ap)
@@ -3617,11 +3622,11 @@ private predicate paramFlowsThrough(
36173622
pragma[nomagic]
36183623
private predicate pathThroughCallable0(
36193624
DataFlowCall call, PathNodeMid mid, ReturnKindExt kind, CallContext cc, AccessPath ap,
3620-
AccessPathApprox apa
3625+
AccessPathApprox apa, Configuration config
36213626
) {
36223627
exists(CallContext innercc, SummaryCtx sc |
3623-
pathIntoCallable(mid, _, cc, innercc, sc, call) and
3624-
paramFlowsThrough(kind, innercc, sc, ap, apa, unbindConf(mid.getConfiguration()))
3628+
pathIntoCallable(mid, _, cc, innercc, sc, call, config) and
3629+
paramFlowsThrough(kind, innercc, sc, ap, apa, config)
36253630
)
36263631
}
36273632

@@ -3631,9 +3636,9 @@ private predicate pathThroughCallable0(
36313636
*/
36323637
pragma[noinline]
36333638
private predicate pathThroughCallable(PathNodeMid mid, NodeEx out, CallContext cc, AccessPath ap) {
3634-
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa |
3635-
pathThroughCallable0(call, mid, kind, cc, ap, apa) and
3636-
out = getAnOutNodeFlow(kind, call, apa, unbindConf(mid.getConfiguration()))
3639+
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa, Configuration config |
3640+
pathThroughCallable0(call, mid, kind, cc, ap, apa, config) and
3641+
out = getAnOutNodeFlow(kind, call, apa, config)
36373642
)
36383643
}
36393644

@@ -3647,10 +3652,11 @@ private module Subpaths {
36473652
PathNode arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind,
36483653
NodeEx out, AccessPath apout
36493654
) {
3650-
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3651-
pathIntoCallable(arg, par, _, innercc, sc, _) and
3652-
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _,
3653-
unbindConf(arg.getConfiguration()))
3655+
exists(Configuration config |
3656+
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3657+
pathIntoCallable(arg, par, _, innercc, sc, _, config) and
3658+
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _, unbindConf(config))
3659+
)
36543660
}
36553661

36563662
/**

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3460,7 +3460,7 @@ private predicate pathStep(
34603460
exists(TypedContent tc | pathReadStep(mid, node, ap.push(tc), tc, cc)) and
34613461
sc = mid.getSummaryCtx()
34623462
or
3463-
pathIntoCallable(mid, node, _, cc, sc, _) and ap = mid.getAp()
3463+
pathIntoCallable(mid, node, _, cc, sc, _, _) and ap = mid.getAp()
34643464
or
34653465
pathOutOfCallable(mid, node, cc) and ap = mid.getAp() and sc instanceof SummaryCtxNone
34663466
or
@@ -3537,14 +3537,16 @@ private predicate pathOutOfCallable(PathNodeMid mid, NodeEx out, CallContext cc)
35373537
*/
35383538
pragma[noinline]
35393539
private predicate pathIntoArg(
3540-
PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa
3540+
PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa,
3541+
Configuration config
35413542
) {
35423543
exists(ArgNode arg |
35433544
arg = mid.getNodeEx().asNode() and
35443545
cc = mid.getCallContext() and
35453546
arg.argumentOf(call, i) and
35463547
ap = mid.getAp() and
3547-
apa = ap.getApprox()
3548+
apa = ap.getApprox() and
3549+
config = mid.getConfiguration()
35483550
)
35493551
}
35503552

@@ -3561,12 +3563,14 @@ private predicate parameterCand(
35613563
pragma[nomagic]
35623564
private predicate pathIntoCallable0(
35633565
PathNodeMid mid, DataFlowCallable callable, int i, CallContext outercc, DataFlowCall call,
3564-
AccessPath ap
3566+
AccessPath ap, Configuration config
35653567
) {
35663568
exists(AccessPathApprox apa |
3567-
pathIntoArg(mid, i, outercc, call, ap, apa) and
3569+
pathIntoArg(mid, pragma[only_bind_into](i), outercc, call, ap, pragma[only_bind_into](apa),
3570+
pragma[only_bind_into](config)) and
35683571
callable = resolveCall(call, outercc) and
3569-
parameterCand(callable, any(int j | j <= i and j >= i), apa, mid.getConfiguration())
3572+
parameterCand(callable, pragma[only_bind_into](i), pragma[only_bind_into](apa),
3573+
pragma[only_bind_into](config))
35703574
)
35713575
}
35723576

@@ -3575,12 +3579,13 @@ private predicate pathIntoCallable0(
35753579
* before and after entering the callable are `outercc` and `innercc`,
35763580
* respectively.
35773581
*/
3582+
pragma[nomagic]
35783583
private predicate pathIntoCallable(
35793584
PathNodeMid mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, SummaryCtx sc,
3580-
DataFlowCall call
3585+
DataFlowCall call, Configuration config
35813586
) {
35823587
exists(int i, DataFlowCallable callable, AccessPath ap |
3583-
pathIntoCallable0(mid, callable, i, outercc, call, ap) and
3588+
pathIntoCallable0(mid, callable, i, outercc, call, ap, config) and
35843589
p.isParameterOf(callable, i) and
35853590
(
35863591
sc = TSummaryCtxSome(p, ap)
@@ -3617,11 +3622,11 @@ private predicate paramFlowsThrough(
36173622
pragma[nomagic]
36183623
private predicate pathThroughCallable0(
36193624
DataFlowCall call, PathNodeMid mid, ReturnKindExt kind, CallContext cc, AccessPath ap,
3620-
AccessPathApprox apa
3625+
AccessPathApprox apa, Configuration config
36213626
) {
36223627
exists(CallContext innercc, SummaryCtx sc |
3623-
pathIntoCallable(mid, _, cc, innercc, sc, call) and
3624-
paramFlowsThrough(kind, innercc, sc, ap, apa, unbindConf(mid.getConfiguration()))
3628+
pathIntoCallable(mid, _, cc, innercc, sc, call, config) and
3629+
paramFlowsThrough(kind, innercc, sc, ap, apa, config)
36253630
)
36263631
}
36273632

@@ -3631,9 +3636,9 @@ private predicate pathThroughCallable0(
36313636
*/
36323637
pragma[noinline]
36333638
private predicate pathThroughCallable(PathNodeMid mid, NodeEx out, CallContext cc, AccessPath ap) {
3634-
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa |
3635-
pathThroughCallable0(call, mid, kind, cc, ap, apa) and
3636-
out = getAnOutNodeFlow(kind, call, apa, unbindConf(mid.getConfiguration()))
3639+
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa, Configuration config |
3640+
pathThroughCallable0(call, mid, kind, cc, ap, apa, config) and
3641+
out = getAnOutNodeFlow(kind, call, apa, config)
36373642
)
36383643
}
36393644

@@ -3647,10 +3652,11 @@ private module Subpaths {
36473652
PathNode arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind,
36483653
NodeEx out, AccessPath apout
36493654
) {
3650-
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3651-
pathIntoCallable(arg, par, _, innercc, sc, _) and
3652-
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _,
3653-
unbindConf(arg.getConfiguration()))
3655+
exists(Configuration config |
3656+
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3657+
pathIntoCallable(arg, par, _, innercc, sc, _, config) and
3658+
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _, unbindConf(config))
3659+
)
36543660
}
36553661

36563662
/**

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3460,7 +3460,7 @@ private predicate pathStep(
34603460
exists(TypedContent tc | pathReadStep(mid, node, ap.push(tc), tc, cc)) and
34613461
sc = mid.getSummaryCtx()
34623462
or
3463-
pathIntoCallable(mid, node, _, cc, sc, _) and ap = mid.getAp()
3463+
pathIntoCallable(mid, node, _, cc, sc, _, _) and ap = mid.getAp()
34643464
or
34653465
pathOutOfCallable(mid, node, cc) and ap = mid.getAp() and sc instanceof SummaryCtxNone
34663466
or
@@ -3537,14 +3537,16 @@ private predicate pathOutOfCallable(PathNodeMid mid, NodeEx out, CallContext cc)
35373537
*/
35383538
pragma[noinline]
35393539
private predicate pathIntoArg(
3540-
PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa
3540+
PathNodeMid mid, int i, CallContext cc, DataFlowCall call, AccessPath ap, AccessPathApprox apa,
3541+
Configuration config
35413542
) {
35423543
exists(ArgNode arg |
35433544
arg = mid.getNodeEx().asNode() and
35443545
cc = mid.getCallContext() and
35453546
arg.argumentOf(call, i) and
35463547
ap = mid.getAp() and
3547-
apa = ap.getApprox()
3548+
apa = ap.getApprox() and
3549+
config = mid.getConfiguration()
35483550
)
35493551
}
35503552

@@ -3561,12 +3563,14 @@ private predicate parameterCand(
35613563
pragma[nomagic]
35623564
private predicate pathIntoCallable0(
35633565
PathNodeMid mid, DataFlowCallable callable, int i, CallContext outercc, DataFlowCall call,
3564-
AccessPath ap
3566+
AccessPath ap, Configuration config
35653567
) {
35663568
exists(AccessPathApprox apa |
3567-
pathIntoArg(mid, i, outercc, call, ap, apa) and
3569+
pathIntoArg(mid, pragma[only_bind_into](i), outercc, call, ap, pragma[only_bind_into](apa),
3570+
pragma[only_bind_into](config)) and
35683571
callable = resolveCall(call, outercc) and
3569-
parameterCand(callable, any(int j | j <= i and j >= i), apa, mid.getConfiguration())
3572+
parameterCand(callable, pragma[only_bind_into](i), pragma[only_bind_into](apa),
3573+
pragma[only_bind_into](config))
35703574
)
35713575
}
35723576

@@ -3575,12 +3579,13 @@ private predicate pathIntoCallable0(
35753579
* before and after entering the callable are `outercc` and `innercc`,
35763580
* respectively.
35773581
*/
3582+
pragma[nomagic]
35783583
private predicate pathIntoCallable(
35793584
PathNodeMid mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, SummaryCtx sc,
3580-
DataFlowCall call
3585+
DataFlowCall call, Configuration config
35813586
) {
35823587
exists(int i, DataFlowCallable callable, AccessPath ap |
3583-
pathIntoCallable0(mid, callable, i, outercc, call, ap) and
3588+
pathIntoCallable0(mid, callable, i, outercc, call, ap, config) and
35843589
p.isParameterOf(callable, i) and
35853590
(
35863591
sc = TSummaryCtxSome(p, ap)
@@ -3617,11 +3622,11 @@ private predicate paramFlowsThrough(
36173622
pragma[nomagic]
36183623
private predicate pathThroughCallable0(
36193624
DataFlowCall call, PathNodeMid mid, ReturnKindExt kind, CallContext cc, AccessPath ap,
3620-
AccessPathApprox apa
3625+
AccessPathApprox apa, Configuration config
36213626
) {
36223627
exists(CallContext innercc, SummaryCtx sc |
3623-
pathIntoCallable(mid, _, cc, innercc, sc, call) and
3624-
paramFlowsThrough(kind, innercc, sc, ap, apa, unbindConf(mid.getConfiguration()))
3628+
pathIntoCallable(mid, _, cc, innercc, sc, call, config) and
3629+
paramFlowsThrough(kind, innercc, sc, ap, apa, config)
36253630
)
36263631
}
36273632

@@ -3631,9 +3636,9 @@ private predicate pathThroughCallable0(
36313636
*/
36323637
pragma[noinline]
36333638
private predicate pathThroughCallable(PathNodeMid mid, NodeEx out, CallContext cc, AccessPath ap) {
3634-
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa |
3635-
pathThroughCallable0(call, mid, kind, cc, ap, apa) and
3636-
out = getAnOutNodeFlow(kind, call, apa, unbindConf(mid.getConfiguration()))
3639+
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa, Configuration config |
3640+
pathThroughCallable0(call, mid, kind, cc, ap, apa, config) and
3641+
out = getAnOutNodeFlow(kind, call, apa, config)
36373642
)
36383643
}
36393644

@@ -3647,10 +3652,11 @@ private module Subpaths {
36473652
PathNode arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind,
36483653
NodeEx out, AccessPath apout
36493654
) {
3650-
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3651-
pathIntoCallable(arg, par, _, innercc, sc, _) and
3652-
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _,
3653-
unbindConf(arg.getConfiguration()))
3655+
exists(Configuration config |
3656+
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3657+
pathIntoCallable(arg, par, _, innercc, sc, _, config) and
3658+
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _, unbindConf(config))
3659+
)
36543660
}
36553661

36563662
/**

0 commit comments

Comments
 (0)