Skip to content

Commit bf14889

Browse files
committed
Java: Refactor to improve performance.
1 parent 3c4e877 commit bf14889

File tree

23 files changed

+353
-224
lines changed

23 files changed

+353
-224
lines changed

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private predicate localFlowStepPlus(
916916
additionalLocalFlowStep(node1, node2, config) and preservesValue = false
917917
) and
918918
node1 != node2 and
919-
cc.validFor(node1) and
919+
cc.relevantFor(node1.getEnclosingCallable()) and
920920
not isUnreachableInCall(node1, cc.(LocalCallContextSpecificCall).getCall()) and
921921
nodeCand(node2, unbind(config))
922922
or
@@ -941,7 +941,7 @@ private predicate localFlowStepPlus(
941941
* Holds if `node1` can step to `node2` in one or more local steps and this
942942
* path can occur as a maximal subsequence of local steps in a dataflow path.
943943
*/
944-
pragma[noinline]
944+
pragma[nomagic]
945945
private predicate localFlowBigStep(
946946
Node node1, Node node2, boolean preservesValue, Configuration config, LocalCallContext callContext
947947
) {
@@ -1734,14 +1734,17 @@ private class PathNodeSink extends PathNode, TPathNodeSink {
17341734
* a callable is recorded by `cc`.
17351735
*/
17361736
private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) {
1737-
exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) |
1738-
localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and
1737+
exists(LocalCallContext localCC, AccessPath ap0, boolean preservesValue |
1738+
localCC = getLocalCallContext(cc, mid.getNode().getEnclosingCallable()) and
1739+
localFlowBigStep(mid.getNode(), node, preservesValue, mid.getConfiguration(), localCC) and
17391740
cc = mid.getCallContext() and
1740-
ap = mid.getAp()
1741+
ap0 = mid.getAp()
1742+
|
1743+
preservesValue = true and
1744+
ap = ap0
17411745
or
1742-
localFlowBigStep(mid.getNode(), node, false, mid.getConfiguration(), localCC) and
1743-
cc = mid.getCallContext() and
1744-
mid.getAp() instanceof AccessPathNil and
1746+
preservesValue = false and
1747+
ap0 instanceof AccessPathNil and
17451748
ap = node.(AccessPathNilNode).getAp()
17461749
)
17471750
or

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private predicate localFlowStepPlus(
916916
additionalLocalFlowStep(node1, node2, config) and preservesValue = false
917917
) and
918918
node1 != node2 and
919-
cc.validFor(node1) and
919+
cc.relevantFor(node1.getEnclosingCallable()) and
920920
not isUnreachableInCall(node1, cc.(LocalCallContextSpecificCall).getCall()) and
921921
nodeCand(node2, unbind(config))
922922
or
@@ -941,7 +941,7 @@ private predicate localFlowStepPlus(
941941
* Holds if `node1` can step to `node2` in one or more local steps and this
942942
* path can occur as a maximal subsequence of local steps in a dataflow path.
943943
*/
944-
pragma[noinline]
944+
pragma[nomagic]
945945
private predicate localFlowBigStep(
946946
Node node1, Node node2, boolean preservesValue, Configuration config, LocalCallContext callContext
947947
) {
@@ -1734,14 +1734,17 @@ private class PathNodeSink extends PathNode, TPathNodeSink {
17341734
* a callable is recorded by `cc`.
17351735
*/
17361736
private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) {
1737-
exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) |
1738-
localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and
1737+
exists(LocalCallContext localCC, AccessPath ap0, boolean preservesValue |
1738+
localCC = getLocalCallContext(cc, mid.getNode().getEnclosingCallable()) and
1739+
localFlowBigStep(mid.getNode(), node, preservesValue, mid.getConfiguration(), localCC) and
17391740
cc = mid.getCallContext() and
1740-
ap = mid.getAp()
1741+
ap0 = mid.getAp()
1742+
|
1743+
preservesValue = true and
1744+
ap = ap0
17411745
or
1742-
localFlowBigStep(mid.getNode(), node, false, mid.getConfiguration(), localCC) and
1743-
cc = mid.getCallContext() and
1744-
mid.getAp() instanceof AccessPathNil and
1746+
preservesValue = false and
1747+
ap0 instanceof AccessPathNil and
17451748
ap = node.(AccessPathNilNode).getAp()
17461749
)
17471750
or

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private predicate localFlowStepPlus(
916916
additionalLocalFlowStep(node1, node2, config) and preservesValue = false
917917
) and
918918
node1 != node2 and
919-
cc.validFor(node1) and
919+
cc.relevantFor(node1.getEnclosingCallable()) and
920920
not isUnreachableInCall(node1, cc.(LocalCallContextSpecificCall).getCall()) and
921921
nodeCand(node2, unbind(config))
922922
or
@@ -941,7 +941,7 @@ private predicate localFlowStepPlus(
941941
* Holds if `node1` can step to `node2` in one or more local steps and this
942942
* path can occur as a maximal subsequence of local steps in a dataflow path.
943943
*/
944-
pragma[noinline]
944+
pragma[nomagic]
945945
private predicate localFlowBigStep(
946946
Node node1, Node node2, boolean preservesValue, Configuration config, LocalCallContext callContext
947947
) {
@@ -1734,14 +1734,17 @@ private class PathNodeSink extends PathNode, TPathNodeSink {
17341734
* a callable is recorded by `cc`.
17351735
*/
17361736
private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) {
1737-
exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) |
1738-
localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and
1737+
exists(LocalCallContext localCC, AccessPath ap0, boolean preservesValue |
1738+
localCC = getLocalCallContext(cc, mid.getNode().getEnclosingCallable()) and
1739+
localFlowBigStep(mid.getNode(), node, preservesValue, mid.getConfiguration(), localCC) and
17391740
cc = mid.getCallContext() and
1740-
ap = mid.getAp()
1741+
ap0 = mid.getAp()
1742+
|
1743+
preservesValue = true and
1744+
ap = ap0
17411745
or
1742-
localFlowBigStep(mid.getNode(), node, false, mid.getConfiguration(), localCC) and
1743-
cc = mid.getCallContext() and
1744-
mid.getAp() instanceof AccessPathNil and
1746+
preservesValue = false and
1747+
ap0 instanceof AccessPathNil and
17451748
ap = node.(AccessPathNilNode).getAp()
17461749
)
17471750
or

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private predicate localFlowStepPlus(
916916
additionalLocalFlowStep(node1, node2, config) and preservesValue = false
917917
) and
918918
node1 != node2 and
919-
cc.validFor(node1) and
919+
cc.relevantFor(node1.getEnclosingCallable()) and
920920
not isUnreachableInCall(node1, cc.(LocalCallContextSpecificCall).getCall()) and
921921
nodeCand(node2, unbind(config))
922922
or
@@ -941,7 +941,7 @@ private predicate localFlowStepPlus(
941941
* Holds if `node1` can step to `node2` in one or more local steps and this
942942
* path can occur as a maximal subsequence of local steps in a dataflow path.
943943
*/
944-
pragma[noinline]
944+
pragma[nomagic]
945945
private predicate localFlowBigStep(
946946
Node node1, Node node2, boolean preservesValue, Configuration config, LocalCallContext callContext
947947
) {
@@ -1734,14 +1734,17 @@ private class PathNodeSink extends PathNode, TPathNodeSink {
17341734
* a callable is recorded by `cc`.
17351735
*/
17361736
private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) {
1737-
exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) |
1738-
localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and
1737+
exists(LocalCallContext localCC, AccessPath ap0, boolean preservesValue |
1738+
localCC = getLocalCallContext(cc, mid.getNode().getEnclosingCallable()) and
1739+
localFlowBigStep(mid.getNode(), node, preservesValue, mid.getConfiguration(), localCC) and
17391740
cc = mid.getCallContext() and
1740-
ap = mid.getAp()
1741+
ap0 = mid.getAp()
1742+
|
1743+
preservesValue = true and
1744+
ap = ap0
17411745
or
1742-
localFlowBigStep(mid.getNode(), node, false, mid.getConfiguration(), localCC) and
1743-
cc = mid.getCallContext() and
1744-
mid.getAp() instanceof AccessPathNil and
1746+
preservesValue = false and
1747+
ap0 instanceof AccessPathNil and
17451748
ap = node.(AccessPathNilNode).getAp()
17461749
)
17471750
or

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -648,10 +648,15 @@ private module ImplCommon {
648648
*/
649649
abstract class CallContext extends TCallContext {
650650
abstract string toString();
651+
652+
/** Holds if this call context is relevant for `callable`. */
653+
abstract predicate relevantFor(DataFlowCallable callable);
651654
}
652655

653656
class CallContextAny extends CallContext, TAnyCallContext {
654657
override string toString() { result = "CcAny" }
658+
659+
override predicate relevantFor(DataFlowCallable callable) { any() }
655660
}
656661

657662
abstract class CallContextCall extends CallContext { }
@@ -663,17 +668,29 @@ private module ImplCommon {
663668
)
664669
}
665670

671+
override predicate relevantFor(DataFlowCallable callable) {
672+
recordDataFlowCallSite(getCall(), callable)
673+
}
674+
666675
DataFlowCall getCall() { this = TSpecificCall(result, _, _) }
667676
}
668677

669678
class CallContextSomeCall extends CallContextCall, TSomeCall {
670679
override string toString() { result = "CcSomeCall" }
680+
681+
override predicate relevantFor(DataFlowCallable callable) {
682+
exists(ParameterNode p | this = TSomeCall(p, _) and p.getEnclosingCallable() = callable)
683+
}
671684
}
672685

673686
class CallContextReturn extends CallContext, TReturn {
674687
override string toString() {
675688
exists(DataFlowCall call | this = TReturn(_, call) | result = "CcReturn(" + call + ")")
676689
}
690+
691+
override predicate relevantFor(DataFlowCallable callable) {
692+
exists(DataFlowCall call | this = TReturn(_, call) and call.getEnclosingCallable() = callable)
693+
}
677694
}
678695

679696
/**
@@ -682,28 +699,14 @@ private module ImplCommon {
682699
abstract class LocalCallContext extends TLocalFlowCallContext {
683700
abstract string toString();
684701

685-
abstract predicate validFor(Node n);
686-
}
687-
688-
/**
689-
* Gets a matching local call context given the call context and a node which is in
690-
* the callable the call is targeting.
691-
*/
692-
LocalCallContext getMatchingLocalCallContext(CallContext ctx, Node n) {
693-
if hasUnreachableNode(ctx.(CallContextSpecificCall).getCall(), n.getEnclosingCallable())
694-
then result.(LocalCallContextSpecificCall).getCall() = ctx.(CallContextSpecificCall).getCall()
695-
else result instanceof LocalCallContextAny
702+
/** Holds if this call context is relevant for `callable`. */
703+
abstract predicate relevantFor(DataFlowCallable callable);
696704
}
697705

698706
class LocalCallContextAny extends LocalCallContext, TAnyLocalCall {
699707
override string toString() { result = "LocalCcAny" }
700708

701-
override predicate validFor(Node n) { any() }
702-
}
703-
704-
pragma[noinline]
705-
private predicate hasUnreachableNode(DataFlowCall call, DataFlowCallable callable) {
706-
isUnreachableInCall(any(Node n | n.getEnclosingCallable() = callable), call)
709+
override predicate relevantFor(DataFlowCallable callable) { any() }
707710
}
708711

709712
class LocalCallContextSpecificCall extends LocalCallContext, TSpecificLocalCall {
@@ -715,7 +718,22 @@ private module ImplCommon {
715718

716719
override string toString() { result = "LocalCcCall(" + call + ")" }
717720

718-
override predicate validFor(Node n) { hasUnreachableNode(call, n.getEnclosingCallable()) }
721+
override predicate relevantFor(DataFlowCallable callable) { relevantLocalCCtx(call, callable) }
722+
}
723+
724+
private predicate relevantLocalCCtx(DataFlowCall call, DataFlowCallable callable) {
725+
exists(Node n | n.getEnclosingCallable() = callable and isUnreachableInCall(n, call))
726+
}
727+
728+
/**
729+
* Gets the local call context given the call context and the callable that
730+
* the contexts apply to.
731+
*/
732+
LocalCallContext getLocalCallContext(CallContext ctx, DataFlowCallable callable) {
733+
ctx.relevantFor(callable) and
734+
if relevantLocalCCtx(ctx.(CallContextSpecificCall).getCall(), callable)
735+
then result.(LocalCallContextSpecificCall).getCall() = ctx.(CallContextSpecificCall).getCall()
736+
else result instanceof LocalCallContextAny
719737
}
720738

721739
/** A callable tagged with a relevant return kind. */

cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private predicate localFlowStepPlus(
916916
additionalLocalFlowStep(node1, node2, config) and preservesValue = false
917917
) and
918918
node1 != node2 and
919-
cc.validFor(node1) and
919+
cc.relevantFor(node1.getEnclosingCallable()) and
920920
not isUnreachableInCall(node1, cc.(LocalCallContextSpecificCall).getCall()) and
921921
nodeCand(node2, unbind(config))
922922
or
@@ -941,7 +941,7 @@ private predicate localFlowStepPlus(
941941
* Holds if `node1` can step to `node2` in one or more local steps and this
942942
* path can occur as a maximal subsequence of local steps in a dataflow path.
943943
*/
944-
pragma[noinline]
944+
pragma[nomagic]
945945
private predicate localFlowBigStep(
946946
Node node1, Node node2, boolean preservesValue, Configuration config, LocalCallContext callContext
947947
) {
@@ -1734,14 +1734,17 @@ private class PathNodeSink extends PathNode, TPathNodeSink {
17341734
* a callable is recorded by `cc`.
17351735
*/
17361736
private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) {
1737-
exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) |
1738-
localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and
1737+
exists(LocalCallContext localCC, AccessPath ap0, boolean preservesValue |
1738+
localCC = getLocalCallContext(cc, mid.getNode().getEnclosingCallable()) and
1739+
localFlowBigStep(mid.getNode(), node, preservesValue, mid.getConfiguration(), localCC) and
17391740
cc = mid.getCallContext() and
1740-
ap = mid.getAp()
1741+
ap0 = mid.getAp()
1742+
|
1743+
preservesValue = true and
1744+
ap = ap0
17411745
or
1742-
localFlowBigStep(mid.getNode(), node, false, mid.getConfiguration(), localCC) and
1743-
cc = mid.getCallContext() and
1744-
mid.getAp() instanceof AccessPathNil and
1746+
preservesValue = false and
1747+
ap0 instanceof AccessPathNil and
17451748
ap = node.(AccessPathNilNode).getAp()
17461749
)
17471750
or

cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private predicate localFlowStepPlus(
916916
additionalLocalFlowStep(node1, node2, config) and preservesValue = false
917917
) and
918918
node1 != node2 and
919-
cc.validFor(node1) and
919+
cc.relevantFor(node1.getEnclosingCallable()) and
920920
not isUnreachableInCall(node1, cc.(LocalCallContextSpecificCall).getCall()) and
921921
nodeCand(node2, unbind(config))
922922
or
@@ -941,7 +941,7 @@ private predicate localFlowStepPlus(
941941
* Holds if `node1` can step to `node2` in one or more local steps and this
942942
* path can occur as a maximal subsequence of local steps in a dataflow path.
943943
*/
944-
pragma[noinline]
944+
pragma[nomagic]
945945
private predicate localFlowBigStep(
946946
Node node1, Node node2, boolean preservesValue, Configuration config, LocalCallContext callContext
947947
) {
@@ -1734,14 +1734,17 @@ private class PathNodeSink extends PathNode, TPathNodeSink {
17341734
* a callable is recorded by `cc`.
17351735
*/
17361736
private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) {
1737-
exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) |
1738-
localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and
1737+
exists(LocalCallContext localCC, AccessPath ap0, boolean preservesValue |
1738+
localCC = getLocalCallContext(cc, mid.getNode().getEnclosingCallable()) and
1739+
localFlowBigStep(mid.getNode(), node, preservesValue, mid.getConfiguration(), localCC) and
17391740
cc = mid.getCallContext() and
1740-
ap = mid.getAp()
1741+
ap0 = mid.getAp()
1742+
|
1743+
preservesValue = true and
1744+
ap = ap0
17411745
or
1742-
localFlowBigStep(mid.getNode(), node, false, mid.getConfiguration(), localCC) and
1743-
cc = mid.getCallContext() and
1744-
mid.getAp() instanceof AccessPathNil and
1746+
preservesValue = false and
1747+
ap0 instanceof AccessPathNil and
17451748
ap = node.(AccessPathNilNode).getAp()
17461749
)
17471750
or

cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ private predicate localFlowStepPlus(
916916
additionalLocalFlowStep(node1, node2, config) and preservesValue = false
917917
) and
918918
node1 != node2 and
919-
cc.validFor(node1) and
919+
cc.relevantFor(node1.getEnclosingCallable()) and
920920
not isUnreachableInCall(node1, cc.(LocalCallContextSpecificCall).getCall()) and
921921
nodeCand(node2, unbind(config))
922922
or
@@ -941,7 +941,7 @@ private predicate localFlowStepPlus(
941941
* Holds if `node1` can step to `node2` in one or more local steps and this
942942
* path can occur as a maximal subsequence of local steps in a dataflow path.
943943
*/
944-
pragma[noinline]
944+
pragma[nomagic]
945945
private predicate localFlowBigStep(
946946
Node node1, Node node2, boolean preservesValue, Configuration config, LocalCallContext callContext
947947
) {
@@ -1734,14 +1734,17 @@ private class PathNodeSink extends PathNode, TPathNodeSink {
17341734
* a callable is recorded by `cc`.
17351735
*/
17361736
private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) {
1737-
exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) |
1738-
localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and
1737+
exists(LocalCallContext localCC, AccessPath ap0, boolean preservesValue |
1738+
localCC = getLocalCallContext(cc, mid.getNode().getEnclosingCallable()) and
1739+
localFlowBigStep(mid.getNode(), node, preservesValue, mid.getConfiguration(), localCC) and
17391740
cc = mid.getCallContext() and
1740-
ap = mid.getAp()
1741+
ap0 = mid.getAp()
1742+
|
1743+
preservesValue = true and
1744+
ap = ap0
17411745
or
1742-
localFlowBigStep(mid.getNode(), node, false, mid.getConfiguration(), localCC) and
1743-
cc = mid.getCallContext() and
1744-
mid.getAp() instanceof AccessPathNil and
1746+
preservesValue = false and
1747+
ap0 instanceof AccessPathNil and
17451748
ap = node.(AccessPathNilNode).getAp()
17461749
)
17471750
or

0 commit comments

Comments
 (0)