Skip to content

Commit 1d3b320

Browse files
authored
Merge pull request #9190 from hvitved/dataflow/summary-arg-param-no-materialize
Data flow: Do not materialize `summaryArgParam`
2 parents 7245591 + 284357d commit 1d3b320

File tree

3 files changed

+39
-45
lines changed

3 files changed

+39
-45
lines changed

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

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -781,11 +781,12 @@ module Private {
781781
)
782782
}
783783

784-
pragma[nomagic]
785-
private ParamNode summaryArgParam(ArgNode arg, ReturnKindExt rk, OutNodeExt out) {
786-
exists(DataFlowCall call |
784+
bindingset[ret]
785+
private ParamNode summaryArgParam(ArgNode arg, ReturnNodeExt ret, OutNodeExt out) {
786+
exists(DataFlowCall call, ReturnKindExt rk |
787787
result = summaryArgParam0(call, arg) and
788-
out = rk.getAnOutNode(call)
788+
pragma[only_bind_out](ret).getKind() = pragma[only_bind_into](rk) and
789+
out = pragma[only_bind_into](rk).getAnOutNode(call)
789790
)
790791
}
791792

@@ -797,9 +798,8 @@ module Private {
797798
* be useful to include in the exposed local data-flow/taint-tracking relations.
798799
*/
799800
predicate summaryThroughStep(ArgNode arg, Node out, boolean preservesValue) {
800-
exists(ReturnKindExt rk, ReturnNodeExt ret |
801-
summaryLocalStep(summaryArgParam(arg, rk, out), ret, preservesValue) and
802-
ret.getKind() = rk
801+
exists(ReturnNodeExt ret |
802+
summaryLocalStep(summaryArgParam(arg, ret, out), ret, preservesValue)
803803
)
804804
}
805805

@@ -811,10 +811,9 @@ module Private {
811811
* be useful to include in the exposed local data-flow/taint-tracking relations.
812812
*/
813813
predicate summaryGetterStep(ArgNode arg, ContentSet c, Node out) {
814-
exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret |
815-
summaryReadStep(summaryArgParam(arg, rk, out), c, mid) and
816-
summaryLocalStep(mid, ret, _) and
817-
ret.getKind() = rk
814+
exists(Node mid, ReturnNodeExt ret |
815+
summaryReadStep(summaryArgParam(arg, ret, out), c, mid) and
816+
summaryLocalStep(mid, ret, _)
818817
)
819818
}
820819

@@ -826,10 +825,9 @@ module Private {
826825
* be useful to include in the exposed local data-flow/taint-tracking relations.
827826
*/
828827
predicate summarySetterStep(ArgNode arg, ContentSet c, Node out) {
829-
exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret |
830-
summaryLocalStep(summaryArgParam(arg, rk, out), mid, _) and
831-
summaryStoreStep(mid, c, ret) and
832-
ret.getKind() = rk
828+
exists(Node mid, ReturnNodeExt ret |
829+
summaryLocalStep(summaryArgParam(arg, ret, out), mid, _) and
830+
summaryStoreStep(mid, c, ret)
833831
)
834832
}
835833
}

java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -781,11 +781,12 @@ module Private {
781781
)
782782
}
783783

784-
pragma[nomagic]
785-
private ParamNode summaryArgParam(ArgNode arg, ReturnKindExt rk, OutNodeExt out) {
786-
exists(DataFlowCall call |
784+
bindingset[ret]
785+
private ParamNode summaryArgParam(ArgNode arg, ReturnNodeExt ret, OutNodeExt out) {
786+
exists(DataFlowCall call, ReturnKindExt rk |
787787
result = summaryArgParam0(call, arg) and
788-
out = rk.getAnOutNode(call)
788+
pragma[only_bind_out](ret).getKind() = pragma[only_bind_into](rk) and
789+
out = pragma[only_bind_into](rk).getAnOutNode(call)
789790
)
790791
}
791792

@@ -797,9 +798,8 @@ module Private {
797798
* be useful to include in the exposed local data-flow/taint-tracking relations.
798799
*/
799800
predicate summaryThroughStep(ArgNode arg, Node out, boolean preservesValue) {
800-
exists(ReturnKindExt rk, ReturnNodeExt ret |
801-
summaryLocalStep(summaryArgParam(arg, rk, out), ret, preservesValue) and
802-
ret.getKind() = rk
801+
exists(ReturnNodeExt ret |
802+
summaryLocalStep(summaryArgParam(arg, ret, out), ret, preservesValue)
803803
)
804804
}
805805

@@ -811,10 +811,9 @@ module Private {
811811
* be useful to include in the exposed local data-flow/taint-tracking relations.
812812
*/
813813
predicate summaryGetterStep(ArgNode arg, ContentSet c, Node out) {
814-
exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret |
815-
summaryReadStep(summaryArgParam(arg, rk, out), c, mid) and
816-
summaryLocalStep(mid, ret, _) and
817-
ret.getKind() = rk
814+
exists(Node mid, ReturnNodeExt ret |
815+
summaryReadStep(summaryArgParam(arg, ret, out), c, mid) and
816+
summaryLocalStep(mid, ret, _)
818817
)
819818
}
820819

@@ -826,10 +825,9 @@ module Private {
826825
* be useful to include in the exposed local data-flow/taint-tracking relations.
827826
*/
828827
predicate summarySetterStep(ArgNode arg, ContentSet c, Node out) {
829-
exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret |
830-
summaryLocalStep(summaryArgParam(arg, rk, out), mid, _) and
831-
summaryStoreStep(mid, c, ret) and
832-
ret.getKind() = rk
828+
exists(Node mid, ReturnNodeExt ret |
829+
summaryLocalStep(summaryArgParam(arg, ret, out), mid, _) and
830+
summaryStoreStep(mid, c, ret)
833831
)
834832
}
835833
}

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

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -781,11 +781,12 @@ module Private {
781781
)
782782
}
783783

784-
pragma[nomagic]
785-
private ParamNode summaryArgParam(ArgNode arg, ReturnKindExt rk, OutNodeExt out) {
786-
exists(DataFlowCall call |
784+
bindingset[ret]
785+
private ParamNode summaryArgParam(ArgNode arg, ReturnNodeExt ret, OutNodeExt out) {
786+
exists(DataFlowCall call, ReturnKindExt rk |
787787
result = summaryArgParam0(call, arg) and
788-
out = rk.getAnOutNode(call)
788+
pragma[only_bind_out](ret).getKind() = pragma[only_bind_into](rk) and
789+
out = pragma[only_bind_into](rk).getAnOutNode(call)
789790
)
790791
}
791792

@@ -797,9 +798,8 @@ module Private {
797798
* be useful to include in the exposed local data-flow/taint-tracking relations.
798799
*/
799800
predicate summaryThroughStep(ArgNode arg, Node out, boolean preservesValue) {
800-
exists(ReturnKindExt rk, ReturnNodeExt ret |
801-
summaryLocalStep(summaryArgParam(arg, rk, out), ret, preservesValue) and
802-
ret.getKind() = rk
801+
exists(ReturnNodeExt ret |
802+
summaryLocalStep(summaryArgParam(arg, ret, out), ret, preservesValue)
803803
)
804804
}
805805

@@ -811,10 +811,9 @@ module Private {
811811
* be useful to include in the exposed local data-flow/taint-tracking relations.
812812
*/
813813
predicate summaryGetterStep(ArgNode arg, ContentSet c, Node out) {
814-
exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret |
815-
summaryReadStep(summaryArgParam(arg, rk, out), c, mid) and
816-
summaryLocalStep(mid, ret, _) and
817-
ret.getKind() = rk
814+
exists(Node mid, ReturnNodeExt ret |
815+
summaryReadStep(summaryArgParam(arg, ret, out), c, mid) and
816+
summaryLocalStep(mid, ret, _)
818817
)
819818
}
820819

@@ -826,10 +825,9 @@ module Private {
826825
* be useful to include in the exposed local data-flow/taint-tracking relations.
827826
*/
828827
predicate summarySetterStep(ArgNode arg, ContentSet c, Node out) {
829-
exists(ReturnKindExt rk, Node mid, ReturnNodeExt ret |
830-
summaryLocalStep(summaryArgParam(arg, rk, out), mid, _) and
831-
summaryStoreStep(mid, c, ret) and
832-
ret.getKind() = rk
828+
exists(Node mid, ReturnNodeExt ret |
829+
summaryLocalStep(summaryArgParam(arg, ret, out), mid, _) and
830+
summaryStoreStep(mid, c, ret)
833831
)
834832
}
835833
}

0 commit comments

Comments
 (0)