From abe14babb11f9b50ee59baf20161a0c2768712c5 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 11:20:15 +0000 Subject: [PATCH 1/9] Rust: Clean up the existing macro cases for the unusedentities test. --- .../unusedentities/UnusedValue.expected | 4 +-- .../test/query-tests/unusedentities/main.rs | 32 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected index 07439e3e0712..02224f15597a 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected @@ -14,8 +14,8 @@ | main.rs:284:13:284:17 | total | Variable $@ is assigned a value that is never used. | main.rs:252:13:252:17 | total | total | | main.rs:377:9:377:9 | x | Variable $@ is assigned a value that is never used. | main.rs:377:9:377:9 | x | x | | main.rs:385:17:385:17 | x | Variable $@ is assigned a value that is never used. | main.rs:385:17:385:17 | x | x | -| main.rs:486:9:486:9 | c | Variable $@ is assigned a value that is never used. | main.rs:486:9:486:9 | c | c | -| main.rs:519:9:519:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:519:9:519:20 | var_in_macro | var_in_macro | +| main.rs:493:9:493:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:493:9:493:20 | var_in_macro | var_in_macro | +| main.rs:502:9:502:9 | c | Variable $@ is assigned a value that is never used. | main.rs:502:9:502:9 | c | c | | more.rs:44:9:44:14 | a_ptr4 | Variable $@ is assigned a value that is never used. | more.rs:44:9:44:14 | a_ptr4 | a_ptr4 | | more.rs:59:9:59:13 | d_ptr | Variable $@ is assigned a value that is never used. | more.rs:59:9:59:13 | d_ptr | d_ptr | | more.rs:65:13:65:17 | f_ptr | Variable $@ is assigned a value that is never used. | more.rs:65:13:65:17 | f_ptr | f_ptr | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index ccd63f1cd53a..f5624ec9fc48 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -478,6 +478,22 @@ fn macros() { }) ) } + +macro_rules! let_in_macro { + ($e:expr) => {{ + let var_in_macro = 0; + $e + }}; +} + +// Our analysis does not currently respect the hygiene rules of Rust macros +// (https://veykril.github.io/tlborm/decl-macros/minutiae/hygiene.html), because +// all we have access to is the expanded AST +fn hygiene_mismatch() { + let var_in_macro = 0; // $ SPURIOUS: Alert[rust/unused-value] + let_in_macro!(var_in_macro); +} + // --- references --- fn references() { @@ -505,21 +521,6 @@ trait MyTrait { fn my_func2(&self, x: i32) -> i32; } -macro_rules! let_in_macro { - ($e:expr) => {{ - let var_in_macro = 0; - $e - }}; -} - -// Our analysis does not currently respect the hygiene rules of Rust macros -// (https://veykril.github.io/tlborm/decl-macros/minutiae/hygiene.html), because -// all we have access to is the expanded AST -fn hygiene_mismatch() { - let var_in_macro = 0; // $ SPURIOUS: Alert[rust/unused-value] - let_in_macro!(var_in_macro); -} - // --- main --- fn main() { @@ -535,6 +536,7 @@ fn main() { func_ptrs(); folds_and_closures(); macros(); + hygiene_mismatch(); references(); generics(); From b2e3352aa8e51d007d954299b914cc58cbb05322 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 11:42:15 +0000 Subject: [PATCH 2/9] Rust: Add a few more macro tests. --- .../unusedentities/UnusedValue.expected | 5 +- .../unusedentities/UnusedVariable.expected | 1 + .../test/query-tests/unusedentities/main.rs | 68 ++++++++++++++++++- .../query-tests/unusedentities/options.yml | 1 + 4 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 rust/ql/test/query-tests/unusedentities/options.yml diff --git a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected index 02224f15597a..cfff994fff89 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected @@ -14,8 +14,9 @@ | main.rs:284:13:284:17 | total | Variable $@ is assigned a value that is never used. | main.rs:252:13:252:17 | total | total | | main.rs:377:9:377:9 | x | Variable $@ is assigned a value that is never used. | main.rs:377:9:377:9 | x | x | | main.rs:385:17:385:17 | x | Variable $@ is assigned a value that is never used. | main.rs:385:17:385:17 | x | x | -| main.rs:493:9:493:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:493:9:493:20 | var_in_macro | var_in_macro | -| main.rs:502:9:502:9 | c | Variable $@ is assigned a value that is never used. | main.rs:502:9:502:9 | c | c | +| main.rs:510:9:510:9 | d | Variable $@ is assigned a value that is never used. | main.rs:510:9:510:9 | d | d | +| main.rs:550:9:550:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:550:9:550:20 | var_in_macro | var_in_macro | +| main.rs:559:9:559:9 | c | Variable $@ is assigned a value that is never used. | main.rs:559:9:559:9 | c | c | | more.rs:44:9:44:14 | a_ptr4 | Variable $@ is assigned a value that is never used. | more.rs:44:9:44:14 | a_ptr4 | a_ptr4 | | more.rs:59:9:59:13 | d_ptr | Variable $@ is assigned a value that is never used. | more.rs:59:9:59:13 | d_ptr | d_ptr | | more.rs:65:13:65:17 | f_ptr | Variable $@ is assigned a value that is never used. | more.rs:65:13:65:17 | f_ptr | f_ptr | diff --git a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected index 203824f4a4b6..7e5c072f423b 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected @@ -19,4 +19,5 @@ | main.rs:431:26:431:28 | val | Variable 'val' is not used. | | main.rs:434:21:434:23 | acc | Variable 'acc' is not used. | | main.rs:455:9:455:14 | unused | Variable 'unused' is not used. | +| main.rs:521:12:521:12 | n | Variable 'n' is not used. | | more.rs:24:9:24:11 | val | Variable 'val' is not used. | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index f5624ec9fc48..0f5814efec4f 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -468,7 +468,64 @@ fn traits() { // --- macros --- -fn macros() { +macro_rules! set_value { + ($x:expr,$y:expr) => { + $x = $y + }; +} + +macro_rules! use_value { + ($x:expr) => { + println!("{}", $x) + }; +} + +fn macros1() { + let a: u16; + let b: u16 = 2; + set_value!(a, 1); + use_value!(b); + + match std::env::args().nth(1).unwrap().parse::() { + Ok(n) => { + use_value!(n); + } + _ => {} + } +} + +fn macros2() { + let a: u16 = 3; + println!("{}", a); + + match std::env::args().nth(1).unwrap().parse::() { + Ok(n) => { + println!("{}", n); + } + _ => {} + } +} + +fn macros3() { + let d: u16 = 4; // $ SPURIOUS: Alert[rust/unused-value] + + undefined_macro_call!(d); +} + +fn macros4() { + undefined_macro_call!(5); +} + +fn macros5() { + match std::env::args().nth(1).unwrap().parse::() { + Ok(n) => { // $ SPURIOUS: Alert[rust/unused-variable] + undefined_macro_call!(n); + } + _ => {} + } +} + +fn macros6() { let x; println!( "The value of x is {}", @@ -476,7 +533,7 @@ fn macros() { x = 10; // $ MISSING: Alert[rust/unused-value] 10 }) - ) + ); } macro_rules! let_in_macro { @@ -535,7 +592,12 @@ fn main() { shadowing(); func_ptrs(); folds_and_closures(); - macros(); + macros1(); + macros2(); + macros3(); + macros4(); + macros5(); + macros6(); hygiene_mismatch(); references(); diff --git a/rust/ql/test/query-tests/unusedentities/options.yml b/rust/ql/test/query-tests/unusedentities/options.yml new file mode 100644 index 000000000000..cf148dd35f86 --- /dev/null +++ b/rust/ql/test/query-tests/unusedentities/options.yml @@ -0,0 +1 @@ +qltest_cargo_check: false From e0839a369cb1ebfc48a98ee9eb41decb9430366e Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 14:17:36 +0000 Subject: [PATCH 3/9] Rust: Fix unused variable FPs due to unexpanded macro calls. --- .../queries/unusedentities/UnusedVariable.ql | 17 ++++++++++++++++- .../unusedentities/UnusedVariable.expected | 1 - rust/ql/test/query-tests/unusedentities/main.rs | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.ql b/rust/ql/src/queries/unusedentities/UnusedVariable.ql index 388c98d07b6a..0ef39e88bbc4 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.ql +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.ql @@ -11,9 +11,24 @@ import rust import UnusedVariable +/** + * A callable for which we have incomplete information, for example because an unexpanded + * macro call is present. These callables are prone to false positive results from unused + * entities queries, unless they are excluded from results. + */ +class IncompleteCallable extends Callable { + IncompleteCallable() { + exists(MacroExpr me | + me.getEnclosingCallable() = this and + not me.getMacroCall().hasExpanded() + ) + } +} + from Variable v where isUnused(v) and not isAllowableUnused(v) and - not v instanceof DiscardVariable + not v instanceof DiscardVariable and + not v.getEnclosingCfgScope() instanceof IncompleteCallable select v, "Variable '" + v + "' is not used." diff --git a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected index 7e5c072f423b..203824f4a4b6 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedVariable.expected @@ -19,5 +19,4 @@ | main.rs:431:26:431:28 | val | Variable 'val' is not used. | | main.rs:434:21:434:23 | acc | Variable 'acc' is not used. | | main.rs:455:9:455:14 | unused | Variable 'unused' is not used. | -| main.rs:521:12:521:12 | n | Variable 'n' is not used. | | more.rs:24:9:24:11 | val | Variable 'val' is not used. | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index 0f5814efec4f..9023fa43c6e6 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -518,7 +518,7 @@ fn macros4() { fn macros5() { match std::env::args().nth(1).unwrap().parse::() { - Ok(n) => { // $ SPURIOUS: Alert[rust/unused-variable] + Ok(n) => { undefined_macro_call!(n); } _ => {} From cc902a6ad1946af441cbd228ed10b4eaf5cd71f6 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 14:31:53 +0000 Subject: [PATCH 4/9] Rust: Fix unused value FPs due to unexpanded macro calls as well. --- .../src/queries/unusedentities/UnusedValue.ql | 3 ++- .../queries/unusedentities/UnusedVariable.ql | 17 +---------------- .../queries/unusedentities/UnusedVariable.qll | 17 +++++++++++++++++ .../unusedentities/UnusedValue.expected | 1 - rust/ql/test/query-tests/unusedentities/main.rs | 2 +- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/rust/ql/src/queries/unusedentities/UnusedValue.ql b/rust/ql/src/queries/unusedentities/UnusedValue.ql index 67c0857b413e..142f5b5ef983 100644 --- a/rust/ql/src/queries/unusedentities/UnusedValue.ql +++ b/rust/ql/src/queries/unusedentities/UnusedValue.ql @@ -21,5 +21,6 @@ where // avoid overlap with the unused variable query not isUnused(v) and not v instanceof DiscardVariable and - not write.isInMacroExpansion() + not write.isInMacroExpansion() and + not isAllowableUnused(v) select write, "Variable $@ is assigned a value that is never used.", v, v.getText() diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.ql b/rust/ql/src/queries/unusedentities/UnusedVariable.ql index 0ef39e88bbc4..388c98d07b6a 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.ql +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.ql @@ -11,24 +11,9 @@ import rust import UnusedVariable -/** - * A callable for which we have incomplete information, for example because an unexpanded - * macro call is present. These callables are prone to false positive results from unused - * entities queries, unless they are excluded from results. - */ -class IncompleteCallable extends Callable { - IncompleteCallable() { - exists(MacroExpr me | - me.getEnclosingCallable() = this and - not me.getMacroCall().hasExpanded() - ) - } -} - from Variable v where isUnused(v) and not isAllowableUnused(v) and - not v instanceof DiscardVariable and - not v.getEnclosingCfgScope() instanceof IncompleteCallable + not v instanceof DiscardVariable select v, "Variable '" + v + "' is not used." diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.qll b/rust/ql/src/queries/unusedentities/UnusedVariable.qll index db4a22b6c7b9..2750ca1c42a5 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.qll +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.qll @@ -16,6 +16,20 @@ predicate isUnused(Variable v) { not exists(v.getInitializer()) } +/** + * A callable for which we have incomplete information, for example because an unexpanded + * macro call is present. These callables are prone to false positive results from unused + * entities queries, unless they are excluded from results. + */ +class IncompleteCallable extends Callable { + IncompleteCallable() { + exists(MacroExpr me | + me.getEnclosingCallable() = this and + not me.getMacroCall().hasExpanded() + ) + } +} + /** * Holds if variable `v` is in a context where we may not find a use for it, * but that's expected and should not be considered a problem. @@ -24,6 +38,9 @@ predicate isAllowableUnused(Variable v) { // in a macro expansion v.getPat().isInMacroExpansion() or + // declared in an incomplete callable + v.getEnclosingCfgScope() instanceof IncompleteCallable + or // a 'self' variable v.getText() = "self" } diff --git a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected index cfff994fff89..5c801e1edd38 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected @@ -14,7 +14,6 @@ | main.rs:284:13:284:17 | total | Variable $@ is assigned a value that is never used. | main.rs:252:13:252:17 | total | total | | main.rs:377:9:377:9 | x | Variable $@ is assigned a value that is never used. | main.rs:377:9:377:9 | x | x | | main.rs:385:17:385:17 | x | Variable $@ is assigned a value that is never used. | main.rs:385:17:385:17 | x | x | -| main.rs:510:9:510:9 | d | Variable $@ is assigned a value that is never used. | main.rs:510:9:510:9 | d | d | | main.rs:550:9:550:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:550:9:550:20 | var_in_macro | var_in_macro | | main.rs:559:9:559:9 | c | Variable $@ is assigned a value that is never used. | main.rs:559:9:559:9 | c | c | | more.rs:44:9:44:14 | a_ptr4 | Variable $@ is assigned a value that is never used. | more.rs:44:9:44:14 | a_ptr4 | a_ptr4 | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index 9023fa43c6e6..b03aa95f7d4a 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -507,7 +507,7 @@ fn macros2() { } fn macros3() { - let d: u16 = 4; // $ SPURIOUS: Alert[rust/unused-value] + let d: u16 = 4; undefined_macro_call!(d); } From fe139e5bead06f8cf5a170993ffc24647db70015 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 14:55:34 +0000 Subject: [PATCH 5/9] Rust: Rearrange the unused variable query logic so that it's clearer what the comments apply to. --- rust/ql/src/queries/unusedentities/UnusedValue.ql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/ql/src/queries/unusedentities/UnusedValue.ql b/rust/ql/src/queries/unusedentities/UnusedValue.ql index 142f5b5ef983..1b0a498afe5c 100644 --- a/rust/ql/src/queries/unusedentities/UnusedValue.ql +++ b/rust/ql/src/queries/unusedentities/UnusedValue.ql @@ -16,11 +16,11 @@ import UnusedVariable from AstNode write, Ssa::Variable v where variableWrite(write, v) and + not v instanceof DiscardVariable and + not write.isInMacroExpansion() and + not isAllowableUnused(v) and // SSA definitions are only created for live writes not write = any(Ssa::WriteDefinition def).getWriteAccess().getAstNode() and // avoid overlap with the unused variable query - not isUnused(v) and - not v instanceof DiscardVariable and - not write.isInMacroExpansion() and - not isAllowableUnused(v) + not isUnused(v) select write, "Variable $@ is assigned a value that is never used.", v, v.getText() From 3d0e44e156c68aea5e9dccc0670bbf56ddca647e Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 7 Mar 2025 16:05:01 +0000 Subject: [PATCH 6/9] Rust: Accept consistency check failures. --- .../unusedentities/CONSISTENCY/ExtractionConsistency.expected | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected diff --git a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected new file mode 100644 index 000000000000..34fd54af5f37 --- /dev/null +++ b/rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected @@ -0,0 +1,4 @@ +extractionWarning +| main.rs:512:5:512:28 | macro expansion failed: could not resolve macro 'undefined_macro_call' | +| main.rs:516:5:516:28 | macro expansion failed: could not resolve macro 'undefined_macro_call' | +| main.rs:522:13:522:36 | macro expansion failed: could not resolve macro 'undefined_macro_call' | From aa35e82fc1121b282eccf6d6a76141849bbe8c66 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:32:15 +0000 Subject: [PATCH 7/9] Rust: Add a test exposing the function scope limitation. --- .../ql/test/query-tests/unusedentities/UnusedValue.expected | 4 ++-- rust/ql/test/query-tests/unusedentities/main.rs | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected index 5c801e1edd38..715d483163ec 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected @@ -14,8 +14,8 @@ | main.rs:284:13:284:17 | total | Variable $@ is assigned a value that is never used. | main.rs:252:13:252:17 | total | total | | main.rs:377:9:377:9 | x | Variable $@ is assigned a value that is never used. | main.rs:377:9:377:9 | x | x | | main.rs:385:17:385:17 | x | Variable $@ is assigned a value that is never used. | main.rs:385:17:385:17 | x | x | -| main.rs:550:9:550:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:550:9:550:20 | var_in_macro | var_in_macro | -| main.rs:559:9:559:9 | c | Variable $@ is assigned a value that is never used. | main.rs:559:9:559:9 | c | c | +| main.rs:556:9:556:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:556:9:556:20 | var_in_macro | var_in_macro | +| main.rs:565:9:565:9 | c | Variable $@ is assigned a value that is never used. | main.rs:565:9:565:9 | c | c | | more.rs:44:9:44:14 | a_ptr4 | Variable $@ is assigned a value that is never used. | more.rs:44:9:44:14 | a_ptr4 | a_ptr4 | | more.rs:59:9:59:13 | d_ptr | Variable $@ is assigned a value that is never used. | more.rs:59:9:59:13 | d_ptr | d_ptr | | more.rs:65:13:65:17 | f_ptr | Variable $@ is assigned a value that is never used. | more.rs:65:13:65:17 | f_ptr | f_ptr | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index b03aa95f7d4a..4cdb1976145d 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -513,7 +513,13 @@ fn macros3() { } fn macros4() { + { + let a: u16 = 6; // $ MISSING: Alert[rust/unused-variable] + } + undefined_macro_call!(5); + + let b: u16 = 6; // $ MISSING: Alert[rust/unused-variable] } fn macros5() { From bb39955a242991e44ad003fc06b5d0b0b293ab4d Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:50:17 +0000 Subject: [PATCH 8/9] Rust: Move the undefined_macros test cases to their own subdirectory. --- .../unusedentities/UnusedValue.expected | 4 +-- .../test/query-tests/unusedentities/main.rs | 28 ---------------- .../undefined_macros/UnusedVariable.expected | 0 .../undefined_macros/UnusedVariable.qlref | 2 ++ .../unusedentities/undefined_macros/main.rs | 33 +++++++++++++++++++ .../{ => undefined_macros}/options.yml | 0 6 files changed, 37 insertions(+), 30 deletions(-) create mode 100644 rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.expected create mode 100644 rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref create mode 100644 rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs rename rust/ql/test/query-tests/unusedentities/{ => undefined_macros}/options.yml (100%) diff --git a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected index 715d483163ec..4ef8ae416250 100644 --- a/rust/ql/test/query-tests/unusedentities/UnusedValue.expected +++ b/rust/ql/test/query-tests/unusedentities/UnusedValue.expected @@ -14,8 +14,8 @@ | main.rs:284:13:284:17 | total | Variable $@ is assigned a value that is never used. | main.rs:252:13:252:17 | total | total | | main.rs:377:9:377:9 | x | Variable $@ is assigned a value that is never used. | main.rs:377:9:377:9 | x | x | | main.rs:385:17:385:17 | x | Variable $@ is assigned a value that is never used. | main.rs:385:17:385:17 | x | x | -| main.rs:556:9:556:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:556:9:556:20 | var_in_macro | var_in_macro | -| main.rs:565:9:565:9 | c | Variable $@ is assigned a value that is never used. | main.rs:565:9:565:9 | c | c | +| main.rs:531:9:531:20 | var_in_macro | Variable $@ is assigned a value that is never used. | main.rs:531:9:531:20 | var_in_macro | var_in_macro | +| main.rs:540:9:540:9 | c | Variable $@ is assigned a value that is never used. | main.rs:540:9:540:9 | c | c | | more.rs:44:9:44:14 | a_ptr4 | Variable $@ is assigned a value that is never used. | more.rs:44:9:44:14 | a_ptr4 | a_ptr4 | | more.rs:59:9:59:13 | d_ptr | Variable $@ is assigned a value that is never used. | more.rs:59:9:59:13 | d_ptr | d_ptr | | more.rs:65:13:65:17 | f_ptr | Variable $@ is assigned a value that is never used. | more.rs:65:13:65:17 | f_ptr | f_ptr | diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index 4cdb1976145d..6da7b55fe5cd 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -507,31 +507,6 @@ fn macros2() { } fn macros3() { - let d: u16 = 4; - - undefined_macro_call!(d); -} - -fn macros4() { - { - let a: u16 = 6; // $ MISSING: Alert[rust/unused-variable] - } - - undefined_macro_call!(5); - - let b: u16 = 6; // $ MISSING: Alert[rust/unused-variable] -} - -fn macros5() { - match std::env::args().nth(1).unwrap().parse::() { - Ok(n) => { - undefined_macro_call!(n); - } - _ => {} - } -} - -fn macros6() { let x; println!( "The value of x is {}", @@ -601,9 +576,6 @@ fn main() { macros1(); macros2(); macros3(); - macros4(); - macros5(); - macros6(); hygiene_mismatch(); references(); diff --git a/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.expected b/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref b/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref new file mode 100644 index 000000000000..67f81cd140b8 --- /dev/null +++ b/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref @@ -0,0 +1,2 @@ +query: queries/unusedentities/UnusedVariable.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs b/rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs new file mode 100644 index 000000000000..0a2ad9e59236 --- /dev/null +++ b/rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs @@ -0,0 +1,33 @@ + +// --- undefined macro calls --- + +fn undefined_macros1() { + let d: u16 = 4; + + undefined_macro_call!(d); +} + +fn undefined_macros2() { + { + let a: u16 = 6; // $ MISSING: Alert[rust/unused-variable] + } + + undefined_macro_call!(5); + + let b: u16 = 6; // $ MISSING: Alert[rust/unused-variable] +} + +fn undefined_macros3() { + match std::env::args().nth(1).unwrap().parse::() { + Ok(n) => { + undefined_macro_call!(n); + } + _ => {} + } +} + +fn main() { + undefined_macros1(); + undefined_macros2(); + undefined_macros3(); +} diff --git a/rust/ql/test/query-tests/unusedentities/options.yml b/rust/ql/test/query-tests/unusedentities/undefined_macros/options.yml similarity index 100% rename from rust/ql/test/query-tests/unusedentities/options.yml rename to rust/ql/test/query-tests/unusedentities/undefined_macros/options.yml From 7717f92ec64878db579f9342ea42e1bf9aadfa9f Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:17:42 +0000 Subject: [PATCH 9/9] Rust: Clean up the test (it turns out a nested UnusedVariable.qlref is not needed) and accept consistency check changes. --- .../CONSISTENCY/ExtractionConsistency.expected | 4 +--- .../unusedentities/undefined_macros/UnusedVariable.expected | 0 .../unusedentities/undefined_macros/UnusedVariable.qlref | 2 -- .../query-tests/unusedentities/undefined_macros/main.rs | 6 +++--- 4 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.expected delete mode 100644 rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref diff --git a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected b/rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected index 34fd54af5f37..f3834c238893 100644 --- a/rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected +++ b/rust/ql/test/query-tests/unusedentities/CONSISTENCY/ExtractionConsistency.expected @@ -1,4 +1,2 @@ extractionWarning -| main.rs:512:5:512:28 | macro expansion failed: could not resolve macro 'undefined_macro_call' | -| main.rs:516:5:516:28 | macro expansion failed: could not resolve macro 'undefined_macro_call' | -| main.rs:522:13:522:36 | macro expansion failed: could not resolve macro 'undefined_macro_call' | +| undefined_macros/main.rs:1:1:1:1 | semantic analyzer unavailable (not included as a module) | diff --git a/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.expected b/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.expected deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref b/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref deleted file mode 100644 index 67f81cd140b8..000000000000 --- a/rust/ql/test/query-tests/unusedentities/undefined_macros/UnusedVariable.qlref +++ /dev/null @@ -1,2 +0,0 @@ -query: queries/unusedentities/UnusedVariable.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs b/rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs index 0a2ad9e59236..5e345677254d 100644 --- a/rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs +++ b/rust/ql/test/query-tests/unusedentities/undefined_macros/main.rs @@ -2,19 +2,19 @@ // --- undefined macro calls --- fn undefined_macros1() { - let d: u16 = 4; + let a: u16; undefined_macro_call!(d); } fn undefined_macros2() { { - let a: u16 = 6; // $ MISSING: Alert[rust/unused-variable] + let a: u16 = 1; // $ MISSING: Alert[rust/unused-value] } undefined_macro_call!(5); - let b: u16 = 6; // $ MISSING: Alert[rust/unused-variable] + let b: u16; // $ MISSING: Alert[rust/unused-variable] } fn undefined_macros3() {