Skip to content

Commit f634b32

Browse files
committed
C++: Fix join-order problem in getNextSwitchCase
Before on `neovim`: ``` [2026-04-28 14:54:20] Evaluated non-recursive predicate Stmt::SwitchCase.getNextSwitchCase/0#dispred#2d3cb6d3@ac8178o2 in 68ms (size: 20848). Evaluated relational algebra for predicate Stmt::SwitchCase.getNextSwitchCase/0#dispred#2d3cb6d3@ac8178o2 with tuple counts: 21888 ~0% {2} r1 = SCAN switch_case OUTPUT In.2, In.0 21888 ~0% {4} | JOIN WITH #switch_caseMerge_21#join_rhs ON FIRST 1 OUTPUT Lhs.1, Lhs.0, _, Rhs.1 21888 ~4% {3} | REWRITE WITH Tmp.2 := 1, Out.2 := (In.3 - Tmp.2) KEEPING 3 24091916 ~0% {3} | JOIN WITH switch_case ON FIRST 1 OUTPUT Lhs.2, Rhs.2, Lhs.1 20848 ~2% {2} | JOIN WITH #switch_caseMerge_12#join_rhs ON FIRST 2 OUTPUT Lhs.1, Lhs.2 return r1 ``` After: ``` [2026-04-28 15:30:53] Evaluated non-recursive predicate Stmt::SwitchCase.getNextSwitchCase/0#dispred#2d3cb6d3@bf9801oj in 0ms (size: 20848). Evaluated relational algebra for predicate Stmt::SwitchCase.getNextSwitchCase/0#dispred#2d3cb6d3@bf9801oj with tuple counts: 21888 ~0% {4} r1 = SCAN switch_case OUTPUT In.0, _, In.2, In.1 21888 ~1% {3} | REWRITE WITH Tmp.1 := 1, Out.1 := (In.3 + Tmp.1) KEEPING 3 20848 ~2% {2} | JOIN WITH switch_case ON FIRST 2 OUTPUT Lhs.2, Rhs.2 return r1 ```
1 parent fa8c1d6 commit f634b32

1 file changed

Lines changed: 4 additions & 2 deletions

File tree

  • cpp/ql/lib/semmle/code/cpp/stmts

cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,8 +1516,10 @@ class SwitchCase extends Stmt, @stmt_switch_case {
15161516
* which has result `default:`, which has no result.
15171517
*/
15181518
SwitchCase getNextSwitchCase() {
1519-
result.getSwitchStmt() = this.getSwitchStmt() and
1520-
result.getChildNum() = this.getChildNum() + 1
1519+
exists(SwitchStmt s, int n |
1520+
this = s.getSwitchCase(n) and
1521+
result = s.getSwitchCase(n + 1)
1522+
)
15211523
}
15221524

15231525
/**

0 commit comments

Comments
 (0)