Skip to content

Commit 35378aa

Browse files
committed
Rust: Add placeholder query + test for unreachable code query.
1 parent 95c18ce commit 35378aa

File tree

4 files changed

+156
-0
lines changed

4 files changed

+156
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* @name Unreachable code
3+
* @description Code that cannot be reached should be deleted.
4+
* @kind problem
5+
* @problem.severity recommendation
6+
* @precision medium
7+
* @id rust/dead-code
8+
* @tags maintainability
9+
*/
10+
11+
import rust
12+
13+
from Locatable e
14+
where none() // TODO: implement query
15+
select e, "This code is never reached."

rust/ql/test/query-tests/unusedentities/UnreachableCode.expected

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
queries/unusedentities/UnreachableCode.ql
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
2+
//fn cond() -> bool;
3+
//fn get_a_number() -> i32;
4+
5+
// --- unreachable code --
6+
7+
fn do_something() {
8+
}
9+
10+
fn unreachable_if() {
11+
if false {
12+
do_something(); // BAD: unreachable code [NOT DETECTED]
13+
} else {
14+
do_something();
15+
}
16+
17+
if true {
18+
do_something();
19+
} else {
20+
do_something(); // BAD: unreachable code [NOT DETECTED]
21+
}
22+
23+
let v = get_a_number();
24+
if v == 1 {
25+
if v != 1 {
26+
do_something(); // BAD: unreachable code [NOT DETECTED]
27+
}
28+
}
29+
30+
if cond() {
31+
return;
32+
do_something(); // BAD: unreachable code [NOT DETECTED]
33+
}
34+
35+
if cond() {
36+
do_something();
37+
} else {
38+
return;
39+
do_something(); // BAD: unreachable code [NOT DETECTED]
40+
}
41+
do_something();
42+
43+
if cond() {
44+
return;
45+
} else {
46+
return;
47+
}
48+
do_something(); // BAD: unreachable code [NOT DETECTED]
49+
}
50+
51+
fn unreachable_panic() {
52+
if cond() {
53+
do_something();
54+
panic!("Oh no!!!");
55+
do_something(); // BAD: unreachable code [NOT DETECTED]
56+
}
57+
58+
if cond() {
59+
do_something();
60+
unimplemented!();
61+
do_something(); // BAD: unreachable code [NOT DETECTED]
62+
}
63+
64+
if cond() {
65+
do_something();
66+
todo!();
67+
do_something(); // BAD: unreachable code [NOT DETECTED]
68+
}
69+
70+
if cond() {
71+
let mut maybe;
72+
73+
maybe = Some("Thing");
74+
_ = maybe.unwrap(); // (safe)
75+
do_something();
76+
77+
maybe = if cond() { Some("Other") } else { None };
78+
_ = maybe.unwrap(); // (might panic)
79+
do_something();
80+
81+
maybe = None;
82+
_ = maybe.unwrap(); // (always panics)
83+
do_something(); // BAD: unreachable code [NOT DETECTED]
84+
}
85+
}
86+
87+
fn unreachable_match() {
88+
match get_a_number() {
89+
1=>{
90+
return;
91+
}
92+
_=>{
93+
do_something();
94+
}
95+
}
96+
do_something();
97+
98+
match get_a_number() {
99+
1=>{
100+
return;
101+
}
102+
_=>{
103+
return;
104+
}
105+
}
106+
do_something(); // BAD: unreachable code [NOT DETECTED]
107+
}
108+
109+
fn unreachable_loop() {
110+
loop {
111+
do_something();
112+
break;
113+
do_something(); // BAD: unreachable code [NOT DETECTED]
114+
}
115+
116+
if cond() {
117+
while cond() {
118+
do_something();
119+
}
120+
121+
while false {
122+
do_something(); // BAD: unreachable code [NOT DETECTED]
123+
}
124+
125+
while true {
126+
do_something();
127+
}
128+
do_something(); // BAD: unreachable code [NOT DETECTED]
129+
}
130+
131+
loop {
132+
if cond() {
133+
return;
134+
do_something(); // BAD: unreachable code [NOT DETECTED]
135+
}
136+
}
137+
do_something(); // BAD: unreachable code [NOT DETECTED]
138+
do_something();
139+
do_something();
140+
}

0 commit comments

Comments
 (0)