Skip to content

Commit ec063d0

Browse files
committed
Rust: Fix bad joins
``` Evaluated relational algebra for predicate _Synth::Synth::TFormatArgument#5cbf2ffd_63#join_rhs__Format::Format.getArgumentRef/0#dispred#38d664c__#antijoin_rhs@889ee4br with tuple counts: 11356 ~0% {5} r1 = JOIN `_Format::Format.getArgumentRef/0#dispred#38d664cb_Format::Format.getParent/0#dispred#f6ec3e8b_10#joi__#shared` WITH Synth::Synth::TFormatArgument#5cbf2ffd_63#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3, Lhs.0 19631351 ~0% {6} | JOIN WITH name_texts_10#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.0 45933 ~0% {6} | JOIN WITH format_args_arg_names_10#join_rhs ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5 747 ~0% {5} | JOIN WITH format_args_expr_args_02#join_rhs ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.4, Lhs.5 return r1 Evaluated relational algebra for predicate __Format::Format.getParent/0#dispred#f6ec3e8b_FormatArgument::FormatArgument.getParent/0#dispred#864__#antijoin_rhs@01d9d70k with tuple counts: 19631351 ~1% {6} r1 = JOIN `_Format::Format.getParent/0#dispred#f6ec3e8b_FormatArgument::FormatArgument.getParent/0#dispred#8641__#shared` WITH name_texts_10#join_rhs ON FIRST 1 OUTPUT Lhs.4, Lhs.0, Lhs.1, Lhs.2, Lhs.3, Rhs.1 5173010 ~0% {7} | JOIN WITH format_args_expr_args ON FIRST 1 OUTPUT Rhs.2, Lhs.5, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.0 747 ~0% {5} | JOIN WITH format_args_arg_names ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.6 return r1 Evaluated relational algebra for predicate _NamedFormatArgument::NamedFormatArgument#18940f8e__Format::Format.getParent/0#dispred#f6ec3e8b_10#j__#antijoin_rhs@dafbd6hr with tuple counts: 11356 ~0% {5} r1 = JOIN `_Format::Format.getParent/0#dispred#f6ec3e8b_10#join_rhs_FormatArgument::FormatArgument.getParent/0#__#shared` WITH NamedFormatArgument::NamedFormatArgument#18940f8e ON FIRST 1 OUTPUT Rhs.4, Lhs.1, Lhs.2, Lhs.3, Lhs.0 19631351 ~0% {6} | JOIN WITH name_texts_10#join_rhs ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.0 45933 ~0% {6} | JOIN WITH format_args_arg_names_10#join_rhs ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5 747 ~0% {5} | JOIN WITH format_args_expr_args_02#join_rhs ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.4, Lhs.5 return r1 ```
1 parent 38bf9c6 commit ec063d0

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

rust/ql/lib/codeql/rust/elements/internal/FormatTemplateVariableAccessConstructor.qll

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,13 @@ predicate constructFormatTemplateVariableAccess(Raw::FormatArgsExpr parent, int
1717
unboundNamedFormatArgument(parent, index, kind, _)
1818
}
1919

20-
/**
21-
* A named format argument for which no binding is found in the parent `FormatArgsExpr::getArg(_)`.
22-
* INTERNAL: Do not use.
23-
*/
24-
predicate unboundNamedFormatArgument(
25-
Raw::FormatArgsExpr parent, int index, int kind, NamedFormatArgument arg
20+
pragma[nomagic]
21+
private predicate formatArgsHasArg(
22+
Raw::FormatArgsExpr parent, NamedFormatArgument arg, string name, int index, int kind
2623
) {
27-
exists(Format format, string name |
28-
not parent.getArg(_).getName().getText() = name and
24+
exists(Format format |
25+
parent = Synth::convertFormatArgsExprToRaw(format.getParent()) and
2926
name = arg.getName() and
30-
Synth::convertFormatArgsExprToRaw(format.getParent()) = parent and
3127
format.getIndex() = index
3228
|
3329
arg = format.getArgumentRef() and kind = 0
@@ -37,3 +33,21 @@ predicate unboundNamedFormatArgument(
3733
arg = format.getPrecisionArgument() and kind = 2
3834
)
3935
}
36+
37+
pragma[nomagic]
38+
private predicate formatArgsHasArgName(Raw::FormatArgsExpr parent, string name) {
39+
parent.getArg(_).getName().getText() = name
40+
}
41+
42+
/**
43+
* A named format argument for which no binding is found in the parent `FormatArgsExpr::getArg(_)`.
44+
* INTERNAL: Do not use.
45+
*/
46+
predicate unboundNamedFormatArgument(
47+
Raw::FormatArgsExpr parent, int index, int kind, NamedFormatArgument arg
48+
) {
49+
exists(string name |
50+
formatArgsHasArg(parent, arg, name, index, kind) and
51+
not formatArgsHasArgName(parent, name)
52+
)
53+
}

0 commit comments

Comments
 (0)