Skip to content

Commit ea9e8e7

Browse files
committed
Swift: fix bad join order in Pattern.getImmediateMatchingExpr
On Signal-iOS, this snippet: ```codeql class Pattern extends Generated::Pattern { ... Expr getImmediateMatchingExpr() { ... exists(PatternBindingDecl v, int i | v.getPattern(i) = this and result = v.getInit(i) ) ... } ... } ``` Had the following join order: ``` 33926 ~0% {3} r8 = SCAN PatternBindingDecl#ab5153b9::Generated::PatternBindingDecl::getImmediateInit#1#dispred#fff OUTPUT In.1, In.0, In.2 2565045964 ~0% {4} r9 = JOIN r8 WITH pattern_binding_decl_patterns_102#join_rhs ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.2, Rhs.2 33926 ~0% {2} r10 = JOIN r9 WITH Synth#5f134a93::Synth::convertPatternBindingDeclToRaw#1#ff ON FIRST 2 OUTPUT Lhs.3, Lhs.2 33926 ~2% {2} r11 = JOIN r10 WITH Synth#5f134a93::Synth::convertPatternFromRaw#1#ff ON FIRST 1 OUTPUT Rhs.1, Lhs.1 33926 ~1% {2} r12 = JOIN r11 WITH Element#e67432df::Generated::Element::resolve#ff ON FIRST 1 OUTPUT Lhs.1, Rhs.1 33926 ~4% {2} r13 = JOIN r12 WITH Element#e67432df::Generated::Element::resolve#ff ON FIRST 1 OUTPUT Lhs.1, Rhs.1 ``` After applying `pragma[only_bind_out]` to `this`: ``` 198815 ~1% {2} r4 = SCAN Synth#5f134a93::Synth::TPattern#f OUTPUT In.0, In.0 198815 ~0% {2} r5 = JOIN r4 WITH Element#e67432df::Generated::Element::resolve#ff_10#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1 75626 ~0% {3} r6 = JOIN r5 WITH PatternBindingDecl#ab5153b9::Generated::PatternBindingDecl::getImmediatePattern#1#dispred#fff_201#join_rhs ON FIRST 1 OUTPUT Rhs.1, Rhs.2, Lhs.1 33926 ~1% {2} r7 = JOIN r6 WITH PatternBindingDecl#ab5153b9::Generated::PatternBindingDecl::getImmediateInit#1#dispred#fff ON FIRST 2 OUTPUT Rhs.2, Lhs.2 33926 ~4% {2} r8 = JOIN r7 WITH Element#e67432df::Generated::Element::resolve#ff ON FIRST 1 OUTPUT Lhs.1, Rhs.1 ```
1 parent 239e14b commit ea9e8e7

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

swift/ql/lib/codeql/swift/elements/pattern/Pattern.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class Pattern extends Generated::Pattern {
3737
)
3838
or
3939
exists(PatternBindingDecl v, int i |
40-
v.getPattern(i) = this and
40+
v.getPattern(i) = pragma[only_bind_out](this) and
4141
result = v.getInit(i)
4242
)
4343
}

0 commit comments

Comments
 (0)