Skip to content

Commit f171eeb

Browse files
committed
Rust: Restrict 'unreachable' to nodes intended to be part of the CFG.
1 parent 70d530a commit f171eeb

File tree

4 files changed

+21
-33
lines changed

4 files changed

+21
-33
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ import codeql.rust.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraph
1717
*/
1818
private predicate unreachable(AstNode n) {
1919
not n = any(CfgNode cfn).getAstNode() and // reachable nodes
20-
n instanceof ControlFlowGraphImpl::ControlFlowTree // part of the CFG
20+
exists(ControlFlowGraphImpl::ControlFlowTree cft |
21+
// nodes intended to be part of the CFG
22+
cft.succ(n, _, _)
23+
or
24+
cft.succ(_, n, _)
25+
)
2126
}
2227

2328
/**
Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,14 @@
1-
| main.rs:216:9:217:9 | MatchArm | This code is never reached. |
2-
| main.rs:218:9:219:9 | MatchArm | This code is never reached. |
3-
| main.rs:224:9:226:9 | MatchArm | This code is never reached. |
4-
| main.rs:227:9:228:9 | MatchArm | This code is never reached. |
5-
| main.rs:233:9:234:9 | MatchArm | This code is never reached. |
6-
| main.rs:235:9:235:28 | MatchArm | This code is never reached. |
7-
| main.rs:240:9:240:26 | MatchArm | This code is never reached. |
8-
| main.rs:241:9:241:25 | MatchArm | This code is never reached. |
91
| unreachable.rs:12:3:12:17 | ExprStmt | This code is never reached. |
102
| unreachable.rs:20:3:20:17 | ExprStmt | This code is never reached. |
113
| unreachable.rs:32:3:32:17 | ExprStmt | This code is never reached. |
124
| unreachable.rs:39:3:39:17 | ExprStmt | This code is never reached. |
13-
| unreachable.rs:46:6:46:8 | ParenExpr | This code is never reached. |
14-
| unreachable.rs:48:7:48:10 | ParenExpr | This code is never reached. |
155
| unreachable.rs:60:2:60:16 | ExprStmt | This code is never reached. |
166
| unreachable.rs:101:3:101:17 | ExprStmt | This code is never reached. |
177
| unreachable.rs:109:3:109:17 | ExprStmt | This code is never reached. |
18-
| unreachable.rs:117:3:119:3 | MatchArm | This code is never reached. |
19-
| unreachable.rs:120:3:122:3 | MatchArm | This code is never reached. |
208
| unreachable.rs:124:2:124:16 | ExprStmt | This code is never reached. |
21-
| unreachable.rs:127:3:129:3 | MatchArm | This code is never reached. |
22-
| unreachable.rs:130:3:132:3 | MatchArm | This code is never reached. |
239
| unreachable.rs:134:2:134:16 | ExprStmt | This code is never reached. |
2410
| unreachable.rs:141:3:141:17 | ExprStmt | This code is never reached. |
2511
| unreachable.rs:150:4:150:18 | ExprStmt | This code is never reached. |
2612
| unreachable.rs:156:3:156:17 | ExprStmt | This code is never reached. |
2713
| unreachable.rs:162:4:162:18 | ExprStmt | This code is never reached. |
2814
| unreachable.rs:165:2:165:16 | ExprStmt | This code is never reached. |
29-
| unreachable.rs:171:10:171:16 | ParenExpr | This code is never reached. |
30-
| unreachable.rs:171:11:171:15 | ParenExpr | This code is never reached. |
31-
| unreachable.rs:171:12:171:14 | ParenExpr | This code is never reached. |

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,32 +213,32 @@ fn if_lets() {
213213

214214
let c = Some(60);
215215
match c {
216-
Some(val) => { // BAD: unused variable SPURIOUS: unreachable
216+
Some(val) => { // BAD: unused variable
217217
}
218-
None => { // SPURIOUS: unused variable 'None', unreachable
218+
None => { // SPURIOUS: unused variable 'None'
219219
}
220220
}
221221

222222
let d = Some(70);
223223
match d {
224-
Some(val) => { // SPURIOUS: unreachable
224+
Some(val) => {
225225
total += val;
226226
}
227-
None => { // SPURIOUS: unused variable 'None', unreachable
227+
None => { // SPURIOUS: unused variable 'None'
228228
}
229229
}
230230

231231
let e = MyOption::Some(80);
232232
match e {
233-
MyOption::Some(val) => { // BAD: unused variable, unreachable
233+
MyOption::Some(val) => { // BAD: unused variable
234234
}
235-
MyOption::None => {} // SPURIOUS: unreachable
235+
MyOption::None => {}
236236
}
237237

238238
let f = YesOrNo::Yes;
239239
match f {
240-
YesOrNo::Yes => {} // SPURIOUS: unreachable
241-
YesOrNo::No => {} // SPURIOUS: unreachable
240+
YesOrNo::Yes => {}
241+
YesOrNo::No => {}
242242
}
243243
}
244244

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ fn unreachable_if() {
4343
if cond() {
4444
let x = cond();
4545

46-
if (x) { // SPURIOUS: unreachable
46+
if (x) {
4747
do_something();
48-
if (!x) { // SPURIOUS: unreachable
48+
if (!x) {
4949
do_something(); // BAD: unreachable code [NOT DETECTED]
5050
}
5151
do_something();
@@ -114,20 +114,20 @@ fn unreachable_panic() {
114114

115115
fn unreachable_match() {
116116
match get_a_number() {
117-
1=>{ // [unreachable FALSE POSITIVE]
117+
1=>{
118118
return;
119119
}
120-
_=>{ // [unreachable FALSE POSITIVE]
120+
_=>{
121121
do_something();
122122
}
123123
}
124124
do_something(); // [unreachable FALSE POSITIVE]
125125

126126
match get_a_number() {
127-
1=>{ // [unreachable FALSE POSITIVE]
127+
1=>{
128128
return;
129129
}
130-
_=>{ // [unreachable FALSE POSITIVE]
130+
_=>{
131131
return;
132132
}
133133
}
@@ -168,5 +168,5 @@ fn unreachable_loop() {
168168
}
169169

170170
fn unreachable_paren() {
171-
let _ = (((1))); // SPURIOUS: unreachable (x3)
171+
let _ = (((1)));
172172
}

0 commit comments

Comments
 (0)