New lint: (maybe_)infinite_iter
This fixes #1870 (mostly, does not account for loops yet)
This commit is contained in:
parent
5cf3f8359f
commit
df903edddd
7 changed files with 369 additions and 1 deletions
40
tests/ui/infinite_iter.rs
Normal file
40
tests/ui/infinite_iter.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
#![feature(plugin)]
|
||||
#![feature(iterator_for_each)]
|
||||
#![plugin(clippy)]
|
||||
use std::iter::repeat;
|
||||
|
||||
fn square_is_lower_64(x: &u32) -> bool { x * x < 64 }
|
||||
|
||||
#[allow(maybe_infinite_iter)]
|
||||
#[deny(infinite_iter)]
|
||||
fn infinite_iters() {
|
||||
repeat(0_u8).collect::<Vec<_>>(); // infinite iter
|
||||
(0..8_u32).take_while(square_is_lower_64).cycle().count(); // infinite iter
|
||||
(0..8_u64).chain(0..).max(); // infinite iter
|
||||
(0_usize..).chain([0usize, 1, 2].iter().cloned()).skip_while(|x| *x != 42).min(); // infinite iter
|
||||
(0..8_u32).rev().cycle().map(|x| x + 1_u32).for_each(|x| println!("{}", x)); // infinite iter
|
||||
(0..3_u32).flat_map(|x| x..).sum::<u32>(); // infinite iter
|
||||
(0_usize..).flat_map(|x| 0..x).product::<usize>(); // infinite iter
|
||||
(0_u64..).filter(|x| x % 2 == 0).last(); // infinite iter
|
||||
(0..42_u64).by_ref().last(); // not an infinite, because ranges are double-ended
|
||||
(0..).next(); // iterator is not exhausted
|
||||
}
|
||||
|
||||
#[deny(maybe_infinite_iter)]
|
||||
fn potential_infinite_iters() {
|
||||
(0..).zip((0..).take_while(square_is_lower_64)).count(); // maybe infinite iter
|
||||
repeat(42).take_while(|x| *x == 42).chain(0..42).max(); // maybe infinite iter
|
||||
(1..).scan(0, |state, x| { *state += x; Some(*state) }).min(); // maybe infinite iter
|
||||
(0..).find(|x| *x == 24); // maybe infinite iter
|
||||
(0..).position(|x| x == 24); // maybe infinite iter
|
||||
(0..).any(|x| x == 24); // maybe infinite iter
|
||||
(0..).all(|x| x == 24); // maybe infinite iter
|
||||
|
||||
(0..).zip(0..42).take_while(|&(x, _)| x != 42).count(); // not infinite
|
||||
repeat(42).take_while(|x| *x == 42).next(); // iterator is not exhausted
|
||||
}
|
||||
|
||||
fn main() {
|
||||
infinite_iters();
|
||||
potential_infinite_iters();
|
||||
}
|
||||
100
tests/ui/infinite_iter.stderr
Normal file
100
tests/ui/infinite_iter.stderr
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
error: you are collect()ing an iterator and throwing away the result. Consider using an explicit for loop to exhaust the iterator
|
||||
--> $DIR/infinite_iter.rs:11:5
|
||||
|
|
||||
11 | repeat(0_u8).collect::<Vec<_>>(); // infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `-D unused-collect` implied by `-D warnings`
|
||||
|
||||
error: infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:11:5
|
||||
|
|
||||
11 | repeat(0_u8).collect::<Vec<_>>(); // infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/infinite_iter.rs:9:8
|
||||
|
|
||||
9 | #[deny(infinite_iter)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:12:5
|
||||
|
|
||||
12 | (0..8_u32).take_while(square_is_lower_64).cycle().count(); // infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:13:5
|
||||
|
|
||||
13 | (0..8_u64).chain(0..).max(); // infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:15:5
|
||||
|
|
||||
15 | (0..8_u32).rev().cycle().map(|x| x + 1_u32).for_each(|x| println!("{}", x)); // infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:17:5
|
||||
|
|
||||
17 | (0_usize..).flat_map(|x| 0..x).product::<usize>(); // infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:18:5
|
||||
|
|
||||
18 | (0_u64..).filter(|x| x % 2 == 0).last(); // infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: possible infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:25:5
|
||||
|
|
||||
25 | (0..).zip((0..).take_while(square_is_lower_64)).count(); // maybe infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/infinite_iter.rs:23:8
|
||||
|
|
||||
23 | #[deny(maybe_infinite_iter)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: possible infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:26:5
|
||||
|
|
||||
26 | repeat(42).take_while(|x| *x == 42).chain(0..42).max(); // maybe infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: possible infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:27:5
|
||||
|
|
||||
27 | (1..).scan(0, |state, x| { *state += x; Some(*state) }).min(); // maybe infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: possible infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:28:5
|
||||
|
|
||||
28 | (0..).find(|x| *x == 24); // maybe infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: possible infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:29:5
|
||||
|
|
||||
29 | (0..).position(|x| x == 24); // maybe infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: possible infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:30:5
|
||||
|
|
||||
30 | (0..).any(|x| x == 24); // maybe infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: possible infinite iteration detected
|
||||
--> $DIR/infinite_iter.rs:31:5
|
||||
|
|
||||
31 | (0..).all(|x| x == 24); // maybe infinite iter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 14 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue