8000 Merge pull request #17865 from hvitved/rust/unused-macro-expansion · github/codeql@662a824 · GitHub
[go: up one dir, main page]

Skip to content

Commit 662a824

Browse files
authored
Merge pull request #17865 from hvitved/rust/unused-macro-expansion
2 parents cec0544 + c4adec3 commit 662a824

File tree

11 files changed

+127
-92
lines changed

11 files changed

+127
-92
lines changed

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,29 @@ module Impl {
2626
result = getImmediateParent(e)
2727
}
2828

29-
/** Gets the nearest enclosing parent of `ast` that is an `AstNode`. */
30-
private AstNode getParentOfAst(AstNode ast) {
31-
result = getParentOfAstStep*(getImmediateParent(ast))
32-
}
33-
3429
class AstNode extends Generated::AstNode {
30+
/**
31+
* Gets the nearest enclosing parent of this node, which is also an `AstNode`,
32+
* if any.
33+
*/
34+
AstNode getParentNode() { result = getParentOfAstStep*(getImmediateParent(this)) }
35+
3536
/** Gets the immediately enclosing callable of this node, if any. */
3637
cached
3738
Callable getEnclosingCallable() {
38-
exists(AstNode p | p = getParentOfAst(this) |
39+
exists(AstNode p | p = this.getParentNode() |
3940
result = p
4041
or
4142
not p instanceof Callable and
4243
result = p.getEnclosingCallable()
4344
)
4445
}
46+
47+
/** Holds if this node is inside a macro expansion. */
48+
predicate isInMacroExpansion() {
49+
this = any(MacroCall mc).getExpanded()
50+
or
51+
this.getParentNode().isInMacroExpansion()
52+
}
4553
}
4654
}

rust/ql/src/queries/unusedentities/UnreachableCode.ql

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ predicate hiddenNode(AstNode n) {
2929
not succ(n, _) and
3030
not succ(_, n)
3131
or
32-
n instanceof ControlFlowGraphImpl::PostOrderTree // location is counter-intuitive
32+
n instanceof ControlFlowGraphImpl::PostOrderTree and // location is counter-intuitive
33+
not n instanceof MacroExpr
34+
or
35+
n.isInMacroExpansion()
3336
}
3437

3538
/**

rust/ql/src/queries/unusedentities/UnusedValue.ql

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ where
2020
not write = any(Ssa::WriteDefinition def).getWriteAccess().getAstNode() and
2121
// avoid overlap with the unused variable query
2222
not isUnused(v) and
23-
not v instanceof DiscardVariable
24-
select write, "Variable is assigned a value that is never used."
23+
not v instanceof DiscardVariable and
24+
not write.isInMacroExpansion()
25+
select write, "Variable $@ is assigned a value that is never used.", v, v.getName()

rust/ql/src/queries/unusedentities/UnusedVariable.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ import UnusedVariable
1313

1414
from Variable v
1515
where isUnused(v)
16-
select v, "Variable is not used."
16+
select v, "Variable '" + v + "' is not used."

rust/ql/src/queries/unusedentities/UnusedVariable.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ predicate isUnused(Variable v) {
1010
not exists(v.getAnAccess()) and
1111
not exists(v.getInitializer()) and
1212
not v instanceof DiscardVariable and
13+
not v.getPat().isInMacroExpansion() and
1314
exists(File f | f.getBaseName() = "main.rs" | v.getLocation().getFile() = f) // temporarily severely limit results
1415
}
Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
| unreachable.rs:11:9:11:23 | ExprStmt | This code is never reached. |
21
| unreachable.rs:19:9:19:23 | ExprStmt | This code is never reached. |
3-
| unreachable.rs:31:9:31:23 | ExprStmt | This code is never reached. |
4-
| unreachable.rs:38:9:38:23 | ExprStmt | This code is never reached. |
5-
| unreachable.rs:59:5:59:19 | ExprStmt | This code is never reached. |
6-
| unreachable.rs:106:13:106:20 | ExprStmt | This code is never reached. |
7-
| unreachable.rs:115:13:115:20 | ExprStmt | This code is never reached. |
8-
| unreachable.rs:141:5:141:19 | ExprStmt | This code is never reached. |
9-
| unreachable.rs:148:9:148:23 | ExprStmt | This code is never reached. |
10-
| unreachable.rs:157:13:157:27 | ExprStmt | This code is never reached. |
11-
| unreachable.rs:163:9:163:23 | ExprStmt | This code is never reached. |
12-
| unreachable.rs:169:13:169:27 | ExprStmt | This code is never reached. |
2+
| unreachable.rs:27:9:27:23 | ExprStmt | This code is never reached. |
3+
| unreachable.rs:39:9:39:23 | ExprStmt | This code is never reached. |
4+
| unreachable.rs:46:9:46:23 | ExprStmt | This code is never reached. |
5+
| unreachable.rs:67:5:67:19 | ExprStmt | This code is never reached. |
6+
| unreachable.rs:114:13:114:20 | MacroExpr | This code is never reached. |
7+
| unreachable.rs:123:13:123:20 | MacroExpr | This code is never reached. |
8+
| unreachable.rs:149:5:149:19 | ExprStmt | This code is never reached. |
9+
| unreachable.rs:156:9:156:23 | ExprStmt | This code is never reached. |
10+
| unreachable.rs:165:13:165:27 | ExprStmt | This code is never reached. |
11+
| unreachable.rs:171:9:171:23 | ExprStmt | This code is never reached. |
1312
| unreachable.rs:177:13:177:27 | ExprStmt | This code is never reached. |
14-
| unreachable.rs:180:5:180:19 | ExprStmt | This code is never reached. |
15-
| unreachable.rs:204:9:204:23 | ExprStmt | This code is never reached. |
16-
| unreachable.rs:220:9:220:23 | ExprStmt | This code is never reached. |
13+
| unreachable.rs:185:13:185:27 | ExprStmt | This code is never reached. |
14+
| unreachable.rs:188:5:188:19 | ExprStmt | This code is never reached. |
15+
| unreachable.rs:212:9:212:23 | ExprStmt | This code is never reached. |
16+
| unreachable.rs:228:9:228:23 | ExprStmt | This code is never reached. |
Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
1-
| main.rs:6:9:6:9 | a | Variable is assigned a value that is never used. |
2-
| main.rs:9:9:9:9 | d | Variable is assigned a value that is never used. |
3-
| main.rs:35:5:35:5 | b | Variable is assigned a value that is never used. |
4-
| main.rs:37:5:37:5 | c | Variable is assigned a value that is never used. |
5-
| main.rs:40:5:40:5 | c | Variable is assigned a value that is never used. |
6-
| main.rs:44:9:44:9 | d | Variable is assigned a value that is never used. |
7-
| main.rs:50:5:50:5 | e | Variable is assigned a value that is never used. |
8-
| main.rs:61:5:61:5 | f | Variable is assigned a value that is never used. |
9-
| main.rs:63:5:63:5 | f | Variable is assigned a value that is never used. |
10-
| main.rs:65:5:65:5 | g | Variable is assigned a value that is never used. |
11-
| main.rs:87:9:87:9 | a | Variable is assigned a value that is never used. |
12-
| main.rs:108:9:108:10 | is | Variable is assigned a value that is never used. |
13-
| main.rs:131:13:131:17 | total | Variable is assigned a value that is never used. |
14-
| main.rs:194:13:194:31 | res | Variable is assigned a value that is never used. |
15-
| main.rs:206:9:206:24 | kind | Variable is assigned a value that is never used. |
16-
| main.rs:210:9:210:32 | kind | Variable is assigned a value that is never used. |
17-
| main.rs:266:13:266:17 | total | Variable is assigned a value that is never used. |
18-
| main.rs:334:5:334:39 | kind | Variable is assigned a value that is never used. |
19-
| main.rs:359:9:359:9 | x | Variable is assigned a value that is never used. |
20-
| main.rs:367:17:367:17 | x | Variable is assigned a value that is never used. |
21-
| more.rs:24:9:24:11 | val | Variable is assigned a value that is never used. |
22-
| more.rs:44:9:44:14 | a_ptr4 | Variable is assigned a value that is never used. |
23-
| more.rs:59:9:59:13 | d_ptr | Variable is assigned a value that is never used. |
24-
| more.rs:65:9:65:17 | f_ptr | Variable is assigned a value that is never used. |
1+
| main.rs:8:9:8:9 | a | Variable $@ is assigned a value that is never used. | main.rs:8:9:8:9 | a | a |
2+
| main.rs:11:9:11:9 | d | Variable $@ is assigned a value that is never used. | main.rs:11:9:11:9 | d | d |
3+
| main.rs:37:5:37:5 | b | Variable $@ is assigned a value that is never used. | main.rs:28:9:28:9 | b | b |
4+
| main.rs:39:5:39:5 | c | Variable $@ is assigned a value that is never used. | main.rs:29:13:29:13 | c | c |
5+
| main.rs:42:5:42:5 | c | Variable $@ is assigned a value that is never used. | main.rs:29:13:29:13 | c | c |
6+
| main.rs:46:9:46:9 | d | Variable $@ is assigned a value that is never used. | main.rs:30:13:30:13 | d | d |
7+
| main.rs:52:5:52:5 | e | Variable $@ is assigned a value that is never used. | main.rs:31:13:31:13 | e | e |
8+
| main.rs:63:5:63:5 | f | Variable $@ is assigned a value that is never used. | main.rs:32:13:32:13 | f | f |
9+
| main.rs:65:5:65:5 | f | Variable $@ is assigned a value that is never used. | main.rs:32:13:32:13 | f | f |
10+
| main.rs:67:5:67:5 | g | Variable $@ is assigned a value that is never used. | main.rs:33:9:33:9 | g | g |
11+
| main.rs:89:9:89:9 | a | Variable $@ is assigned a value that is never used. | main.rs:89:9:89:9 | a | a |
12+
| main.rs:110:9:110:10 | is | Variable $@ is assigned a value that is never used. | main.rs:110:9:110:10 | is | is |
13+
| main.rs:133:13:133:17 | total | Variable $@ is assigned a value that is never used. | main.rs:133:13:133:17 | total | total |
14+
| main.rs:270:13:270:17 | total | Variable $@ is assigned a value that is never used. | main.rs:238:13:238:17 | total | total |
15+
| main.rs:363:9:363:9 | x | Variable $@ is assigned a value that is never used. | main.rs:363:9:363:9 | x | x |
16+
| main.rs:371:17:371:17 | x | Variable $@ is assigned a value that is never used. | main.rs:371:17:371:17 | x | x |
17+
| more.rs:24:9:24:11 | val | Variable $@ is assigned a value that is never used. | more.rs:24:9:24:11 | val | val |
18+
| 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 |
19+
| 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 |
20+
| more.rs:65:9:65:17 | f_ptr | Variable $@ is assigned a value that is never used. | more.rs:65:13:65:17 | f_ptr | f_ptr |
Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
| main.rs:25:9:25:9 | a | Variable is not used. |
2-
| main.rs:90:13:90:13 | d | Variable is not used. |
3-
| main.rs:139:5:139:5 | y | Variable is not used. |
4-
| main.rs:166:9:166:9 | x | Variable is not used. |
5-
| main.rs:236:17:236:17 | a | Variable is not used. |
6-
| main.rs:244:20:244:22 | val | Variable is not used. |
7-
| main.rs:258:14:258:16 | val | Variable is not used. |
8-
| main.rs:273:22:273:24 | val | Variable is not used. |
9-
| main.rs:280:24:280:26 | val | Variable is not used. |
10-
| main.rs:288:13:288:15 | num | Variable is not used. |
11-
| main.rs:303:12:303:12 | j | Variable is not used. |
12-
| main.rs:323:25:323:25 | y | Variable is not used. |
13-
| main.rs:326:28:326:28 | a | Variable is not used. |
14-
| main.rs:329:9:329:9 | p | Variable is not used. |
15-
| main.rs:347:9:347:13 | right | Variable is not used. |
16-
| main.rs:353:9:353:14 | right2 | Variable is not used. |
17-
| main.rs:360:13:360:13 | y | Variable is not used. |
18-
| main.rs:368:21:368:21 | y | Variable is not used. |
19-
| main.rs:413:26:413:28 | val | Variable is not used. |
20-
| main.rs:416:21:416:23 | acc | Variable is not used. |
21-
| main.rs:437:9:437:14 | unused | Variable is not used. |
1+
| main.rs:27:9:27:9 | a | Variable 'a' is not used. |
2+
| main.rs:92:13:92:13 | d | Variable 'd' is not used. |
3+
| main.rs:141:5:141:5 | y | Variable 'y' is not used. |
4+
| main.rs:168:9:168:9 | x | Variable 'x' is not used. |
5+
| main.rs:240:17:240:17 | a | Variable 'a' is not used. |
6+
| main.rs:248:20:248:22 | val | Variable 'val' is not used. |
7+
| main.rs:262:14:262:16 | val | Variable 'val' is not used. |
8+
| main.rs:277:22:277:24 | val | Variable 'val' is not used. |
9+
| main.rs:284:24:284:26 | val | Variable 'val' is not used. |
10+
| main.rs:292:13:292:15 | num | Variable 'num' is not used. |
11+
| main.rs:307:12:307:12 | j | Variable 'j' is not used. |
12+
| main.rs:327:25:327:25 | y | Variable 'y' is not used. |
13+
| main.rs:330:28:330:28 | a | Variable 'a' is not used. |
14+
| main.rs:333:9:333:9 | p | Variable 'p' is not used. |
15+
| main.rs:351:9:351:13 | right | Variable 'right' is not used. |
16+
| main.rs:357:9:357:14 | right2 | Variable 'right2' is not used. |
17+
| main.rs:364:13:364:13 | y | Variable 'y' is not used. |
18+
| main.rs:372:21:372:21 | y | Variable 'y' is not used. |
19+
| main.rs:417:26:417:28 | val | Variable 'val' is not used. |
20+
| main.rs:420:21:420:23 | acc | Variable 'acc' is not used. |
21+
| main.rs:441:9:441:14 | unused | Variable 'unused' is not used. |

rust/ql/test/query-tests/unusedentities/main.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
//fn cond() -> bool;
1+
mod unreachable;
2+
3+
use unreachable::*;
24

35
// --- locals ---
46

@@ -191,7 +193,7 @@ fn loops() {
191193
}
192194

193195
for x in 1..10 {
194-
_ = format!("x is {x}"); // $ SPURIOUS: Alert[rust/unused-value]
196+
_ = format!("x is {x}");
195197
}
196198

197199
for x in 1..10 {
@@ -203,11 +205,13 @@ fn loops() {
203205
}
204206

205207
for x in 1..10 {
206-
assert_eq!(x, 1); // $ SPURIOUS: Alert[rust/unused-value]
208+
assert_eq!(x, 1);
209+
break;
207210
}
208211

209212
for x in 1..10 {
210-
assert_eq!(id(x), id(1)); // $ SPURIOUS: Alert[rust/unused-value]
213+
assert_eq!(id(x), id(1));
214+
break;
211215
}
212216
}
213217

@@ -331,7 +335,7 @@ fn if_lets_matches() {
331335
}
332336

333337
let duration1 = std::time::Duration::new(10, 0); // ten seconds
334-
assert_eq!(duration1.as_secs(), 10); // $ SPURIOUS: Alert[rust/unused-value]
338+
assert_eq!(duration1.as_secs(), 10);
335339

336340
let duration2: Result<std::time::Duration, String> = Ok(std::time::Duration::new(10, 0));
337341
match duration2 {
@@ -434,7 +438,7 @@ impl Incrementable for MyValue {
434438
fn increment(
435439
&mut self,
436440
times: i32,
437-
unused: i32, // $ Alert[rust/unused-variable]
441+
unused: &mut i32, // $ Alert[rust/unused-variable]
438442
) {
439443
self.value += times;
440444
}
@@ -443,9 +447,22 @@ impl Incrementable for MyValue {
443447
fn traits() {
444448
let mut i = MyValue { value: 0 };
445449
let a = 1;
446-
let b = 2;
450+
let mut b = 2;
451+
452+
i.increment(a, &mut b);
453+
}
447454

448-
i.increment(a, b);
455+
// --- macros ---
456+
457+
fn macros() {
458+
let x;
459+
println!(
460+
"The value of x is {}",
461+
({
462+
x = 10; // $ MISSING: Alert[rust/unused-value]
463+
10
464+
})
465+
)
449466
}
450467

451468
// --- main ---
@@ -464,12 +481,14 @@ fn main() {
464481
folds_and_closures();
465482

466483
unreachable_if_1();
467-
unreachable_panic();
484+
// unreachable_panic();
468485
unreachable_match();
469-
unreachable_loop();
486+
// unreachable_loop();
470487
unreachable_paren();
471488
unreachable_let_1();
472489
unreachable_let_2();
473490
unreachable_if_2();
474491
unreachable_if_3();
492+
493+
macros();
475494
}

rust/ql/test/query-tests/unusedentities/options

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)
0