Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b3af3ad

Browse files
committed
Data flow: Fix bad join order in getReturnPosition()
Joining on the enclosing callable before the kind is crucial, as witnessed by this pipeline: ``` [2020-02-06 17:58:21] (1086s) Starting to evaluate predicate DataFlowImplCommon::getReturnPosition#ff/2@83c546 [2020-02-06 18:53:16] (4382s) Tuple counts for DataFlowImplCommon::getReturnPosition#ff: 385478 ~1% {3} r1 = SCAN DataFlowImplCommon::Cached::TReturnPosition0#fff@staged_ext AS I OUTPUT I.<2>, I.<0>, I.<1> 385478 ~2% {3} r2 = JOIN r1 WITH DataFlowImplCommon::Cached::TReturnPosition0#fff_2#join_rhs AS R ON FIRST 1 OUTPUT r1.<2>, r1.<1>, r1.<0> 58638116860 ~0% {3} r3 = JOIN r2 WITH DataFlowImplCommon::ReturnNodeExt::getKind_dispred#ff_10#join_rhs AS R ON FIRST 1 OUTPUT R.<1>, r2.<1>, r2.<2> 914049 ~0% {2} r4 = JOIN r3 WITH DataFlowImplCommon::returnNodeGetEnclosingCallable#ff AS R ON FIRST 2 OUTPUT r3.<0>, r3.<2> return r4 ```
1 parent 6e14ba4 commit b3af3ad

4 files changed

Lines changed: 28 additions & 4 deletions

File tree

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,9 +753,15 @@ private DataFlowCallable returnNodeGetEnclosingCallable(ReturnNodeExt ret) {
753753
result = ret.getEnclosingCallable()
754754
}
755755

756+
pragma[noinline]
757+
private ReturnPosition getReturnPosition0(ReturnNodeExt ret, ReturnKindExt kind) {
758+
result.getCallable() = returnNodeGetEnclosingCallable(ret) and
759+
kind = result.getKind()
760+
}
761+
756762
pragma[noinline]
757763
ReturnPosition getReturnPosition(ReturnNodeExt ret) {
758-
result = TReturnPosition0(returnNodeGetEnclosingCallable(ret), ret.getKind())
764+
result = getReturnPosition0(ret, ret.getKind())
759765
}
760766

761767
bindingset[cc, callable]

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,9 +753,15 @@ private DataFlowCallable returnNodeGetEnclosingCallable(ReturnNodeExt ret) {
753753
result = ret.getEnclosingCallable()
754754
}
755755

756+
pragma[noinline]
757+
private ReturnPosition getReturnPosition0(ReturnNodeExt ret, ReturnKindExt kind) {
758+
result.getCallable() = returnNodeGetEnclosingCallable(ret) and
759+
kind = result.getKind()
760+
}
761+
756762
pragma[noinline]
757763
ReturnPosition getReturnPosition(ReturnNodeExt ret) {
758-
result = TReturnPosition0(returnNodeGetEnclosingCallable(ret), ret.getKind())
764+
result = getReturnPosition0(ret, ret.getKind())
759765
}
760766

761767
bindingset[cc, callable]

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,9 +753,15 @@ private DataFlowCallable returnNodeGetEnclosingCallable(ReturnNodeExt ret) {
753753
result = ret.getEnclosingCallable()
754754
}
755755

756+
pragma[noinline]
757+
private ReturnPosition getReturnPosition0(ReturnNodeExt ret, ReturnKindExt kind) {
758+
result.getCallable() = returnNodeGetEnclosingCallable(ret) and
759+
kind = result.getKind()
760+
}
761+
756762
pragma[noinline]
757763
ReturnPosition getReturnPosition(ReturnNodeExt ret) {
758-
result = TReturnPosition0(returnNodeGetEnclosingCallable(ret), ret.getKind())
764+
result = getReturnPosition0(ret, ret.getKind())
759765
}
760766

761767
bindingset[cc, callable]

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,9 +753,15 @@ private DataFlowCallable returnNodeGetEnclosingCallable(ReturnNodeExt ret) {
753753
result = ret.getEnclosingCallable()
754754
}
755755

756+
pragma[noinline]
757+
private ReturnPosition getReturnPosition0(ReturnNodeExt ret, ReturnKindExt kind) {
758+
result.getCallable() = returnNodeGetEnclosingCallable(ret) and
759+
kind = result.getKind()
760+
}
761+
756762
pragma[noinline]
757763
ReturnPosition getReturnPosition(ReturnNodeExt ret) {
758-
result = TReturnPosition0(returnNodeGetEnclosingCallable(ret), ret.getKind())
764+
result = getReturnPosition0(ret, ret.getKind())
759765
}
760766

761767
bindingset[cc, callable]

0 commit comments

Comments
 (0)