From c160a1f6581c968a14371ddbdf5df1fe1a98d4c0 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 10 Dec 2025 15:55:28 +0000 Subject: [PATCH 1/4] Rust: Fix common FPs for rust/unused-variable and rust/unused-value. --- rust/ql/src/queries/unusedentities/UnusedVariable.qll | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.qll b/rust/ql/src/queries/unusedentities/UnusedVariable.qll index c0684636e77b..64d49a547f10 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.qll +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.qll @@ -43,4 +43,8 @@ predicate isAllowableUnused(Variable v) { or // a 'self' variable v.getText() = "self" + or + // a common source of false positives is match arms that are misrecognized as + // a variable, having not been correctly resolved + v.getPat().getParentNode() instanceof MatchArm } From 6ca90a2d6219191a4b3842b497fdfb855fce2b34 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 10 Dec 2025 16:23:04 +0000 Subject: [PATCH 2/4] Rust: Change note. --- rust/ql/src/change-notes/2025-12-10-unused-variable.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2025-12-10-unused-variable.md diff --git a/rust/ql/src/change-notes/2025-12-10-unused-variable.md b/rust/ql/src/change-notes/2025-12-10-unused-variable.md new file mode 100644 index 000000000000..7391255e608c --- /dev/null +++ b/rust/ql/src/change-notes/2025-12-10-unused-variable.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed common false positives for the `rust/unused-variable` and `rust/unused-value` queries. From f1d241f810683bdacfbe05d535a892b001230de3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:09:12 +0000 Subject: [PATCH 3/4] Rust: Accept test change. --- rust/ql/test/query-tests/unusedentities/UnusedVariable.expected | 1 - rust/ql/test/query-tests/unusedentities/main.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected index 583587b8a139..ca3b2979ef9e 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected @@ -10,7 +10,6 @@ | main.rs:307:13:307:15 | num | Variable 'num' is not used. | | main.rs:342:25:342:25 | y | Variable 'y' is not used. | | main.rs:345:28:345:28 | a | Variable 'a' is not used. | -| main.rs:348:9:348:9 | p | Variable 'p' is not used. | | main.rs:366:9:366:13 | right | Variable 'right' is not used. | | main.rs:372:9:372:14 | right2 | Variable 'right2' is not used. | | main.rs:383:13:383:13 | y | Variable 'y' is not used. | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index a08a05a83bde..96bd808cee9a 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -345,7 +345,7 @@ fn if_lets_matches() { MyPoint { x: 3, y: a } => { // $ Alert[rust/unused-variable] } MyPoint { x: 4, .. } => {} - p => { // $ Alert[rust/unused-variable] + p => { // $ MISSING: Alert[rust/unused-variable] } } From d88bae9ec20df5e18dba21f7e07db0c63724b11f Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:57:16 +0000 Subject: [PATCH 4/4] Rust: Narrow the exclusion a little. --- rust/ql/src/queries/unusedentities/UnusedVariable.qll | 8 +++++--- .../query-tests/unusedentities/UnusedVariable.expected | 1 + rust/ql/test/query-tests/unusedentities/main.rs | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.qll b/rust/ql/src/queries/unusedentities/UnusedVariable.qll index 64d49a547f10..744af559dd2a 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.qll +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.qll @@ -44,7 +44,9 @@ predicate isAllowableUnused(Variable v) { // a 'self' variable v.getText() = "self" or - // a common source of false positives is match arms that are misrecognized as - // a variable, having not been correctly resolved - v.getPat().getParentNode() instanceof MatchArm + // a common source of false positives is match arms containing constants + // (typically beginning with a capital letter) that are misrecognized as a + // variable, having not been correctly resolved. + v.getPat().getParentNode() instanceof MatchArm and + v.getText().charAt(0).isUppercase() } diff --git a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected index ca3b2979ef9e..583587b8a139 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected @@ -10,6 +10,7 @@ | main.rs:307:13:307:15 | num | Variable 'num' is not used. | | main.rs:342:25:342:25 | y | Variable 'y' is not used. | | main.rs:345:28:345:28 | a | Variable 'a' is not used. | +| main.rs:348:9:348:9 | p | Variable 'p' is not used. | | main.rs:366:9:366:13 | right | Variable 'right' is not used. | | main.rs:372:9:372:14 | right2 | Variable 'right2' is not used. | | main.rs:383:13:383:13 | y | Variable 'y' is not used. | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index 96bd808cee9a..a08a05a83bde 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -345,7 +345,7 @@ fn if_lets_matches() { MyPoint { x: 3, y: a } => { // $ Alert[rust/unused-variable] } MyPoint { x: 4, .. } => {} - p => { // $ MISSING: Alert[rust/unused-variable] + p => { // $ Alert[rust/unused-variable] } }