Skip to content

Commit 1f07ebe

Browse files
committed
Rust: Fallback crate resolution
1 parent b42b737 commit 1f07ebe

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

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

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ abstract class ItemNode extends Locatable {
188188
crateDefEdge(this, name, result, kind)
189189
or
190190
crateDependencyEdge(this, name, result) and
191+
not declaresDirectly(this, TTypeNamespace(), name) and
191192
kind.isInternal()
192193
or
193194
externCrateEdge(this, name, result) and
@@ -1153,6 +1154,11 @@ private class BuiltinSourceFile extends SourceFileItemNode {
11531154
pragma[nomagic]
11541155
private predicate crateDependencyEdge(SourceFileItemNode file, string name, CrateItemNode dep) {
11551156
exists(CrateItemNode c | dep = c.(Crate).getDependency(name) | file = c.getASourceFile())
1157+
or
1158+
// All files _should_ belong to a crate, but for those where we cannot identify the crate,
1159+
// we give access to all crates as a fallback.
1160+
not file = any(Crate c).getASourceFile() and
1161+
name = dep.getName()
11561162
}
11571163

11581164
private predicate useTreeDeclares(UseTree tree, string name) {
@@ -1174,15 +1180,24 @@ private predicate useTreeDeclares(UseTree tree, string name) {
11741180

11751181
/**
11761182
* Holds if `item` explicitly declares a sub item named `name` in the
1177-
* namespace `ns`. This includes items declared by `use` statements,
1178-
* except for glob imports.
1183+
* namespace `ns`. This excludes items declared by `use` statements.
11791184
*/
11801185
pragma[nomagic]
1181-
private predicate declares(ItemNode item, Namespace ns, string name) {
1186+
private predicate declaresDirectly(ItemNode item, Namespace ns, string name) {
11821187
exists(ItemNode child, SuccessorKind kind | child = getAChildSuccessor(item, name, kind) |
11831188
child.getNamespace() = ns and
11841189
kind.isInternalOrBoth()
11851190
)
1191+
}
1192+
1193+
/**
1194+
* Holds if `item` explicitly declares a sub item named `name` in the
1195+
* namespace `ns`. This includes items declared by `use` statements,
1196+
* except for glob imports.
1197+
*/
1198+
pragma[nomagic]
1199+
private predicate declares(ItemNode item, Namespace ns, string name) {
1200+
declaresDirectly(item, ns, name)
11861201
or
11871202
exists(ItemNode child |
11881203
child.getImmediateParent() = item and
@@ -1482,20 +1497,13 @@ private predicate externCrateEdge(ExternCrateItemNode ec, string name, CrateItem
14821497

14831498
pragma[nomagic]
14841499
private predicate preludeItem(string name, ItemNode i) {
1485-
exists(Crate stdOrCore, string stdOrCoreName |
1486-
stdOrCore.getName() = stdOrCoreName and
1487-
stdOrCoreName = ["std", "core"]
1488-
|
1489-
name = stdOrCoreName and
1490-
i = stdOrCore
1491-
or
1492-
exists(ModuleLikeNode mod, ModuleItemNode prelude, ModuleItemNode rust |
1493-
mod = stdOrCore.getSourceFile() and
1494-
prelude = mod.getASuccessor("prelude") and
1495-
rust = prelude.getASuccessor(["rust_2015", "rust_2018", "rust_2021", "rust_2024"]) and
1496-
i = rust.getASuccessor(name) and
1497-
not name = ["super", "self"]
1498-
)
1500+
exists(Crate stdOrCore, ModuleLikeNode mod, ModuleItemNode prelude, ModuleItemNode rust |
1501+
stdOrCore.getName() = ["std", "core"] and
1502+
mod = stdOrCore.getSourceFile() and
1503+
prelude = mod.getASuccessor("prelude") and
1504+
rust = prelude.getASuccessor(["rust_2015", "rust_2018", "rust_2021", "rust_2024"]) and
1505+
i = rust.getASuccessor(name) and
1506+
not name = ["super", "self"]
14991507
)
15001508
}
15011509

@@ -1512,7 +1520,7 @@ private predicate preludeItem(string name, ItemNode i) {
15121520
pragma[nomagic]
15131521
private predicate preludeEdge(SourceFile f, string name, ItemNode i) {
15141522
preludeItem(name, i) and
1515-
not declares(f, _, name)
1523+
not declares(f, i.getNamespace(), name)
15161524
}
15171525

15181526
pragma[nomagic]
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
multipleCallTargets
22
| main.rs:87:19:87:40 | ...::from(...) |
33
| main.rs:106:19:106:40 | ...::from(...) |
4+
| main.rs:388:5:388:27 | ... .add_assign(...) |
5+
| main.rs:473:9:473:23 | z.add_assign(...) |

0 commit comments

Comments
 (0)