From 42c07b37451377858666e8716b60c1ceef022f83 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 20 Aug 2026 14:47:33 +0200 Subject: [PATCH 1/2] Rust: Exclude 'unused variable' results for functions containing `todo!()` or `unimplemented!()` --- rust/ql/src/queries/unusedentities/UnusedVariable.qll | 9 +++++++-- rust/ql/test/query-tests/unusedentities/main.rs | 8 ++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.qll b/rust/ql/src/queries/unusedentities/UnusedVariable.qll index 744af559dd2a..22070162d78a 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.qll +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.qll @@ -1,4 +1,5 @@ import rust +private import codeql.rust.internal.PathResolution /** * A deliberately unused variable, for example `_` or `_x`. @@ -23,9 +24,13 @@ predicate isUnused(Variable v) { */ class IncompleteCallable extends Callable { IncompleteCallable() { - exists(MacroExpr me | - me.getEnclosingCallable() = this and + exists(MacroExpr me | me.getEnclosingCallable() = this | not me.getMacroCall().hasMacroCallExpansion() + or + exists(ItemNode i | + i.getCanonicalPath(_) = ["core::macros::unimplemented", "core::macros::todo"] and + me.getMacroCall().resolveMacro() = i + ) ) } } diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index a08a05a83bde..3f89e1d79155 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -558,6 +558,14 @@ trait MyTrait { fn my_func2(&self, x: i32) -> i32; } +fn unimplemented(x : i32) { + unimplemented!() +} + +fn todo(x : i32) { + todo!() +} + // --- main --- fn main() { From bbff992ee161a21c59c26d6b2747a741763b715f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 20 Aug 2026 17:18:42 +0200 Subject: [PATCH 2/2] Add change note --- .../2026-08-20-unused-variables-in-incomplete-functions.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md diff --git a/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md b/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md new file mode 100644 index 000000000000..882c91178175 --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `rust/unused-variable` query no longer reports variables in functions containing the standard `todo!()` or `unimplemented!()` macros. \ No newline at end of file