rust-lang/rust-clippy

needless_range_loop produces code with different behaviour

オープン

#6,930 opened on 2021/03/18

 (13 件のコメント) (3 件のリアクション) (1 人の担当者)Rust (1,391 件のフォーク)batch import
A-documentationL-suggestiongood first issue

Repository metrics

Stars
 (10,406 個のスター)
PR merge metrics
 (PR metrics pending)

説明

needless_range_loop suggests changing:

pub fn foo_a(out: &mut Vec<usize>, inx: &[usize], base: usize) {
    for i in 1 .. base {
        out[i] = *inx.get(i).unwrap_or(&0);
    }
}

to

pub fn foo_b(out: &mut Vec<usize>, inx: &[usize], base: usize) {
    for (i, item) in out.iter_mut().enumerate().take(base).skip(1) {
        *item = *inx.get(i).unwrap_or(&0);
    }
}

However, these are only equivalent is out has at least base elements. If not, then this changes behaviour (the first version panics with out of bounds, the second silently truncates the loop).

See this example at https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=6f00aec168a98758df574f0734a2233e (edit: this link was previously broken, thanks)

(I noticed this will discussing needless_range_loop in #6075 )

コントリビューターガイド