Skip to content

Commit 68ab2fb

Browse files
tausbnCopilot
andcommitted
Rust: fix QL references for schema changes and add upgrade/downgrade scripts
- Fix Meta usage: Meta is now abstract with subtypes (PathMeta, KeyValueMeta, TokenTreeMeta, etc.) - Fix FormatArgsArg: getName() replaced by getArgName() returning FormatArgsArgName - Add upgrade script (old → new) and downgrade script (new → old) - Update Definitions.qll, PathResolution.qll, BadCtorInitialization.ql, FormatTemplateVariableAccessConstructor.qll Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 35fc6fb commit 68ab2fb

File tree

11 files changed

+14449
-19
lines changed

11 files changed

+14449
-19
lines changed

rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/old.dbscheme

Lines changed: 3623 additions & 0 deletions
Large diffs are not rendered by default.

rust/downgrades/109496fd2f20f28a35e50b110859e74882ee80d6/rust.dbscheme

Lines changed: 3556 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
description: Downgrade from rust-analyzer 0.0.328 to 0.0.301
2+
compatibility: partial
3+
4+
format_args_arg_arg_names.rel: delete
5+
format_args_arg_names.rel: delete
6+
struct_field_default_vals.rel: delete
7+
variant_const_args.rel: delete
8+
try_block_modifiers.rel: delete
9+
try_block_modifier_is_try.rel: delete
10+
try_block_modifier_type_reprs.rel: delete
11+
cfg_atoms.rel: delete
12+
cfg_attr_meta.rel: delete
13+
cfg_attr_meta_cfg_predicates.rel: delete
14+
cfg_attr_meta_metas.rel: delete
15+
cfg_composites.rel: delete
16+
cfg_composite_cfg_predicates.rel: delete
17+
cfg_meta.rel: delete
18+
cfg_meta_cfg_predicates.rel: delete
19+
key_value_meta.rel: delete
20+
key_value_meta_exprs.rel: delete
21+
key_value_meta_paths.rel: delete
22+
path_meta.rel: delete
23+
path_meta_paths.rel: delete
24+
token_tree_meta.rel: delete
25+
token_tree_meta_paths.rel: delete
26+
token_tree_meta_token_trees.rel: delete
27+
unsafe_meta.rel: delete
28+
unsafe_meta_is_unsafe.rel: delete
29+
unsafe_meta_meta.rel: delete

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ private predicate formatArgsHasArg(
3535
}
3636

3737
pragma[nomagic]
38-
private predicate formatArgsHasArgName(Raw::FormatArgsExpr parent, string name) {
39-
parent.getArg(_).getName().getText() = name
38+
private predicate formatArgsHasArgName(Raw::FormatArgsExpr parent) {
39+
exists(parent.getArg(_).getArgName())
4040
}
4141

4242
/**
@@ -48,6 +48,6 @@ predicate unboundNamedFormatArgument(
4848
) {
4949
exists(string name |
5050
formatArgsHasArg(parent, arg, name, index, kind) and
51-
not formatArgsHasArgName(parent, name)
51+
not formatArgsHasArgName(parent)
5252
)
5353
}

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

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/internal/Definitions.qll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ private import codeql.rust.elements.Variable
88
private import codeql.rust.elements.Locatable
99
private import codeql.rust.elements.FormatArgsExpr
1010
private import codeql.rust.elements.FormatArgsArg
11+
private import codeql.rust.elements.FormatArgsArgName
1112
private import codeql.rust.elements.Format
1213
private import codeql.rust.elements.MacroCall
1314
private import codeql.rust.elements.NamedFormatArgument
@@ -33,7 +34,7 @@ private module Cached {
3334
cached
3435
newtype TDef =
3536
TVariable(Variable v) or
36-
TFormatArgsArgName(Name name) { name = any(FormatArgsArg a).getName() } or
37+
TFormatArgsArgDef(FormatArgsArgName name) { name = any(FormatArgsArg a).getArgName() } or
3738
TFormatArgsArgIndex(Expr e) { e = any(FormatArgsArg a).getExpr() } or
3839
TItemNode(ItemNode i)
3940

@@ -58,16 +59,16 @@ class Definition extends Cached::TDef {
5859
/** Gets the location of this variable. */
5960
Location getLocation() {
6061
result = this.asVariable().getLocation() or
61-
result = this.asName().getLocation() or
62+
result = this.asFormatArgsArgName().getLocation() or
6263
result = this.asExpr().getLocation() or
6364
result = this.asItemNode().getLocation()
6465
}
6566

6667
/** Gets this definition as a `Variable` */
6768
Variable asVariable() { this = Cached::TVariable(result) }
6869

69-
/** Gets this definition as a `Name` */
70-
Name asName() { this = Cached::TFormatArgsArgName(result) }
70+
/** Gets this definition as a format argument name */
71+
FormatArgsArgName asFormatArgsArgName() { this = Cached::TFormatArgsArgDef(result) }
7172

7273
/** Gets this definition as an `Expr` */
7374
Expr asExpr() { this = Cached::TFormatArgsArgIndex(result) }
@@ -79,7 +80,7 @@ class Definition extends Cached::TDef {
7980
string toString() {
8081
result = this.asExpr().toString() or
8182
result = this.asVariable().toString() or
82-
result = this.asName().getText() or
83+
result = this.asFormatArgsArgName().toString() or
8384
result = this.asItemNode().toString()
8485
}
8586
}
@@ -95,17 +96,16 @@ private class LocalVariableUse extends Use instanceof VariableAccess {
9596
}
9697

9798
private class NamedFormatArgumentUse extends Use instanceof NamedFormatArgument {
98-
private Name def;
99+
private FormatArgsArgName def;
99100

100101
NamedFormatArgumentUse() {
101102
exists(FormatArgsExpr parent |
102103
parent = this.getParent().getParent() and
103-
parent.getAnArg().getName() = def and
104-
this.getName() = def.getText()
104+
parent.getAnArg().getArgName() = def
105105
)
106106
}
107107

108-
override Definition getDefinition() { result.asName() = def }
108+
override Definition getDefinition() { result.asFormatArgsArgName() = def }
109109

110110
override string getUseType() { result = "format argument" }
111111
}

rust/ql/lib/codeql/rust/internal/PathResolution.qll

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,20 @@ private import codeql.rust.internal.CachedStages
4949
private import codeql.rust.frameworks.stdlib.Builtins as Builtins
5050
private import codeql.util.Option
5151

52+
/** Gets the path of a `Meta` node, regardless of its concrete subtype. */
53+
pragma[nomagic]
54+
private Path getMetaPath(Meta m) {
55+
result = m.(PathMeta).getPath()
56+
or
57+
result = m.(KeyValueMeta).getPath()
58+
or
59+
result = m.(TokenTreeMeta).getPath()
60+
}
61+
62+
/** Gets the expression of a `Meta` node, regardless of its concrete subtype. */
63+
pragma[nomagic]
64+
private Expr getMetaExpr(Meta m) { result = m.(KeyValueMeta).getExpr() }
65+
5266
private newtype TNamespace =
5367
TTypeNamespace() or
5468
TValueNamespace() or
@@ -263,7 +277,7 @@ abstract class ItemNode extends Locatable {
263277
pragma[nomagic]
264278
final Attr getAttr(string name) {
265279
result = this.getAnAttr() and
266-
result.getMeta().getPath().(PathExt).isUnqualified(name)
280+
getMetaPath(result.getMeta()).(PathExt).isUnqualified(name)
267281
}
268282

269283
final predicate hasAttr(string name) { exists(this.getAttr(name)) }
@@ -1348,7 +1362,7 @@ private predicate fileModuleInlineLate(SourceFile f, string name, Folder folder)
13481362
*/
13491363
private Meta getPathAttrMeta(Module m) {
13501364
result = m.getAnAttr().getMeta() and
1351-
result.getPath().getText() = "path"
1365+
getMetaPath(result).getText() = "path"
13521366
}
13531367

13541368
/**
@@ -1412,7 +1426,7 @@ private predicate pathAttrImport(Folder f, Module m, string relativePath) {
14121426
exists(Meta meta |
14131427
f = m.getFile().getParentContainer() and
14141428
meta = getPathAttrMeta(m) and
1415-
relativePath = meta.getExpr().(LiteralExpr).getTextValue().regexpCapture("\"(.+)\"", 1)
1429+
relativePath = getMetaExpr(meta).(LiteralExpr).getTextValue().regexpCapture("\"(.+)\"", 1)
14161430
)
14171431
}
14181432

@@ -1793,7 +1807,7 @@ private module DollarCrateResolution {
17931807
or
17941808
exists(ItemNode type |
17951809
expansion = type.(TypeItem).getDeriveMacroExpansion(_) and
1796-
macroDefPath = type.getAttr("derive").getMeta().getPath()
1810+
macroDefPath = getMetaPath(type.getAttr("derive").getMeta())
17971811
)
17981812
}
17991813

@@ -1952,7 +1966,7 @@ private predicate pathUsesNamespace(PathExt p, Namespace n) {
19521966
(
19531967
p = any(MacroCall mc).getPath()
19541968
or
1955-
p = any(Meta m).getPath()
1969+
p = getMetaPath(any(Meta m))
19561970
)
19571971
}
19581972

0 commit comments

Comments
 (0)