Skip to content

Commit 5be7a97

Browse files
committed
Data flow: Avoid unnecessary non-linear recursion via getConfiguration()
1 parent ee44e74 commit 5be7a97

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

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

Lines changed: 22 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,9 +3563,9 @@ private predicate parameterCand(
35613563
pragma[nomagic]
35623564
private predicate pathIntoCallable0(
35633565
PathNodeMid mid, DataFlowCallable callable, int i, CallContext outercc, DataFlowCall call,
3564-
AccessPath ap, AccessPathApprox apa
3566+
AccessPath ap, AccessPathApprox apa, Configuration config
35653567
) {
3566-
pathIntoArg(mid, i, outercc, call, ap, apa) and
3568+
pathIntoArg(mid, i, outercc, call, ap, apa, config) and
35673569
callable = resolveCall(call, outercc)
35683570
}
35693571

@@ -3572,13 +3574,14 @@ private predicate pathIntoCallable0(
35723574
* before and after entering the callable are `outercc` and `innercc`,
35733575
* respectively.
35743576
*/
3577+
pragma[nomagic]
35753578
private predicate pathIntoCallable(
35763579
PathNodeMid mid, ParamNodeEx p, CallContext outercc, CallContextCall innercc, SummaryCtx sc,
3577-
DataFlowCall call
3580+
DataFlowCall call, Configuration config
35783581
) {
35793582
exists(int i, DataFlowCallable callable, AccessPath ap, AccessPathApprox apa |
3580-
pathIntoCallable0(mid, callable, i, outercc, call, ap, apa) and
3581-
parameterCand(callable, i, apa, mid.getConfiguration()) and
3583+
pathIntoCallable0(mid, callable, i, outercc, call, ap, apa, config) and
3584+
parameterCand(callable, i, apa, config) and
35823585
p.isParameterOf(callable, i) and
35833586
(
35843587
sc = TSummaryCtxSome(p, ap)
@@ -3615,11 +3618,11 @@ private predicate paramFlowsThrough(
36153618
pragma[nomagic]
36163619
private predicate pathThroughCallable0(
36173620
DataFlowCall call, PathNodeMid mid, ReturnKindExt kind, CallContext cc, AccessPath ap,
3618-
AccessPathApprox apa
3621+
AccessPathApprox apa, Configuration config
36193622
) {
36203623
exists(CallContext innercc, SummaryCtx sc |
3621-
pathIntoCallable(mid, _, cc, innercc, sc, call) and
3622-
paramFlowsThrough(kind, innercc, sc, ap, apa, unbindConf(mid.getConfiguration()))
3624+
pathIntoCallable(mid, _, cc, innercc, sc, call, config) and
3625+
paramFlowsThrough(kind, innercc, sc, ap, apa, config)
36233626
)
36243627
}
36253628

@@ -3629,9 +3632,9 @@ private predicate pathThroughCallable0(
36293632
*/
36303633
pragma[noinline]
36313634
private predicate pathThroughCallable(PathNodeMid mid, NodeEx out, CallContext cc, AccessPath ap) {
3632-
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa |
3633-
pathThroughCallable0(call, mid, kind, cc, ap, apa) and
3634-
out = getAnOutNodeFlow(kind, call, apa, unbindConf(mid.getConfiguration()))
3635+
exists(DataFlowCall call, ReturnKindExt kind, AccessPathApprox apa, Configuration config |
3636+
pathThroughCallable0(call, mid, kind, cc, ap, apa, config) and
3637+
out = getAnOutNodeFlow(kind, call, apa, config)
36353638
)
36363639
}
36373640

@@ -3645,10 +3648,11 @@ private module Subpaths {
36453648
PathNode arg, ParamNodeEx par, SummaryCtxSome sc, CallContext innercc, ReturnKindExt kind,
36463649
NodeEx out, AccessPath apout
36473650
) {
3648-
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3649-
pathIntoCallable(arg, par, _, innercc, sc, _) and
3650-
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _,
3651-
unbindConf(arg.getConfiguration()))
3651+
exists(Configuration config |
3652+
pathThroughCallable(arg, out, _, pragma[only_bind_into](apout)) and
3653+
pathIntoCallable(arg, par, _, innercc, sc, _, config) and
3654+
paramFlowsThrough(kind, innercc, sc, pragma[only_bind_into](apout), _, unbindConf(config))
3655+
)
36523656
}
36533657

36543658
/**

0 commit comments

Comments
 (0)