[INFO] updating cached repository thoughtworks/candouble [INFO] running `"git" "fetch" "--all"` [INFO] [stdout] Fetching origin [INFO] [stderr] From git://github.com/thoughtworks/candouble [INFO] [stderr] * branch HEAD -> FETCH_HEAD [INFO] running `"git" "clone" "work/cache/sources/gh/thoughtworks/candouble" "work/ex/clippy-test-run/sources/stable/gh/thoughtworks/candouble"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable/gh/thoughtworks/candouble'... [INFO] [stderr] done. [INFO] running `"git" "clone" "work/cache/sources/gh/thoughtworks/candouble" "work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/thoughtworks/candouble"` [INFO] [stderr] Cloning into 'work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/thoughtworks/candouble'... [INFO] [stderr] done. [INFO] running `"git" "rev-parse" "HEAD"` [INFO] [stdout] b4b63f28461c58622abde046aca75156488bf332 [INFO] sha for GitHub repo thoughtworks/candouble: b4b63f28461c58622abde046aca75156488bf332 [INFO] validating manifest of thoughtworks/candouble on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of thoughtworks/candouble on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing thoughtworks/candouble [INFO] finished frobbing thoughtworks/candouble [INFO] frobbed toml for thoughtworks/candouble written to work/ex/clippy-test-run/sources/stable/gh/thoughtworks/candouble/Cargo.toml [INFO] started frobbing thoughtworks/candouble [INFO] finished frobbing thoughtworks/candouble [INFO] frobbed toml for thoughtworks/candouble written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/gh/thoughtworks/candouble/Cargo.toml [INFO] crate thoughtworks/candouble has a lockfile. skipping [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting thoughtworks/candouble against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-3/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/gh/thoughtworks/candouble:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 8f412d8c3a3943b9c61a6435c8e09d6eb3e47163fc0c600d5b8ab0b6ca8f45b2 [INFO] running `"docker" "start" "-a" "8f412d8c3a3943b9c61a6435c8e09d6eb3e47163fc0c600d5b8ab0b6ca8f45b2"` [INFO] [stderr] Compiling candouble v0.1.0 (/opt/crater/workdir) [INFO] [stderr] Checking getopts v0.2.18 [INFO] [stderr] Checking serde_json v1.0.30 [INFO] [stderr] Compiling syn v0.15.6 [INFO] [stderr] Compiling serde_derive v1.0.79 [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:19:17 [INFO] [stderr] | [INFO] [stderr] 19 | return Predicate::equals(message, args); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Predicate::equals(message, args)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:22:17 [INFO] [stderr] | [INFO] [stderr] 22 | return Predicate::matches_template(message, id, data); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Predicate::matches_template(message, id, data)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:49:13 [INFO] [stderr] | [INFO] [stderr] 49 | return true; [INFO] [stderr] | ^^^^^^^^^^^^ help: remove `return` as shown: `true` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:51:13 [INFO] [stderr] | [INFO] [stderr] 51 | return value == utils::num_from_string_u64(pattern); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `value == utils::num_from_string_u64(pattern)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/utils.rs:9:12 [INFO] [stderr] | [INFO] [stderr] 9 | } else { [INFO] [stderr] | ____________^ [INFO] [stderr] 10 | | if let Ok(n) = string.parse::() { [INFO] [stderr] 11 | | return n; [INFO] [stderr] 12 | | } [INFO] [stderr] 13 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 9 | } else if let Ok(n) = string.parse::() { [INFO] [stderr] 10 | return n; [INFO] [stderr] 11 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:19:17 [INFO] [stderr] | [INFO] [stderr] 19 | return Predicate::equals(message, args); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Predicate::equals(message, args)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_return)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:22:17 [INFO] [stderr] | [INFO] [stderr] 22 | return Predicate::matches_template(message, id, data); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `Predicate::matches_template(message, id, data)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:49:13 [INFO] [stderr] | [INFO] [stderr] 49 | return true; [INFO] [stderr] | ^^^^^^^^^^^^ help: remove `return` as shown: `true` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: unneeded return statement [INFO] [stderr] --> src/predicate.rs:51:13 [INFO] [stderr] | [INFO] [stderr] 51 | return value == utils::num_from_string_u64(pattern); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return` as shown: `value == utils::num_from_string_u64(pattern)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stderr] [INFO] [stderr] warning: this `else { if .. }` block can be collapsed [INFO] [stderr] --> src/utils.rs:9:12 [INFO] [stderr] | [INFO] [stderr] 9 | } else { [INFO] [stderr] | ____________^ [INFO] [stderr] 10 | | if let Ok(n) = string.parse::() { [INFO] [stderr] 11 | | return n; [INFO] [stderr] 12 | | } [INFO] [stderr] 13 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::collapsible_if)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if [INFO] [stderr] help: try [INFO] [stderr] | [INFO] [stderr] 9 | } else if let Ok(n) = string.parse::() { [INFO] [stderr] 10 | return n; [INFO] [stderr] 11 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `imposter::Imposter` [INFO] [stderr] --> src/imposter.rs:12:5 [INFO] [stderr] | [INFO] [stderr] 12 | / pub fn new() -> Imposter { [INFO] [stderr] 13 | | Imposter { stubs: Vec::new() } [INFO] [stderr] 14 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 6 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stderr] --> src/imposter.rs:42:47 [INFO] [stderr] | [INFO] [stderr] 42 | pub fn handle_message(&mut self, adaptor: &Box, message: &CANMessage) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: try: `&CANAdaptor` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::borrowed_box)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stderr] [INFO] [stderr] warning: defining a method called `from_str` on this type; consider implementing the `std::str::FromStr` trait or choosing a less ambiguous name [INFO] [stderr] --> src/stub.rs:26:5 [INFO] [stderr] | [INFO] [stderr] 26 | / pub fn from_str(s: &str) -> Result { [INFO] [stderr] 27 | | let def: StubDefinition = serde_json::from_str(s).expect("Failed to parse JSON"); [INFO] [stderr] 28 | | Ok(Stub { def, response_idx: 0, response_repeats: 0 }) [INFO] [stderr] 29 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::should_implement_trait)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/stub.rs:32:45 [INFO] [stderr] | [INFO] [stderr] 32 | let mut file = File::open(filename).expect(&format!("Failed to open file {}", filename)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!("Failed to open file {}", filename))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::expect_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/stub.rs:34:44 [INFO] [stderr] | [INFO] [stderr] 34 | file.read_to_string(&mut contents).expect(&format!("Failed to read file {}", filename)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!("Failed to read file {}", filename))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/stub.rs:39:45 [INFO] [stderr] | [INFO] [stderr] 39 | self.def.predicates.iter().find(|p| p.eval(message) == false).is_none() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!p.eval(message)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/stub.rs:43:12 [INFO] [stderr] | [INFO] [stderr] 43 | if self.def.responses.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.def.responses.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/predicate.rs:35:55 [INFO] [stderr] | [INFO] [stderr] 35 | pub fn matches_template(message: &CANMessage, id: &String, data: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/predicate.rs:35:70 [INFO] [stderr] | [INFO] [stderr] 35 | pub fn matches_template(message: &CANMessage, id: &String, data: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/predicate.rs:36:12 [INFO] [stderr] | [INFO] [stderr] 36 | if Predicate::matches_value(id, message.id) == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!Predicate::matches_value(id, message.id)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `data` [INFO] [stderr] --> src/predicate.rs:39:18 [INFO] [stderr] | [INFO] [stderr] 39 | for i in 0..data.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 39 | for (i, ) in data.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/predicate.rs:40:16 [INFO] [stderr] | [INFO] [stderr] 40 | if Predicate::matches_value(&data[i], message.data[i] as u64) == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!Predicate::matches_value(&data[i], message.data[i] as u64)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u64 may become silently lossy if types change [INFO] [stderr] --> src/predicate.rs:40:51 [INFO] [stderr] | [INFO] [stderr] 40 | if Predicate::matches_value(&data[i], message.data[i] as u64) == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `u64::from(message.data[i])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: methods called `new` usually return `Self` [INFO] [stderr] --> src/can/dummy.rs:9:5 [INFO] [stderr] | [INFO] [stderr] 9 | / pub fn new() -> Result, &'static str> { [INFO] [stderr] 10 | | Ok(Box::new(DummyAdaptor {})) [INFO] [stderr] 11 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_ret_no_self)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_ret_no_self [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `can::CANMessage` [INFO] [stderr] --> src/can/mod.rs:21:5 [INFO] [stderr] | [INFO] [stderr] 21 | / pub fn new() -> CANMessage { [INFO] [stderr] 22 | | unsafe { mem::zeroed() } [INFO] [stderr] 23 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 13 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `data` [INFO] [stderr] --> src/can/mod.rs:30:18 [INFO] [stderr] | [INFO] [stderr] 30 | for i in 0..data.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 30 | for (i, ) in data.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: it looks like you're manually copying between slices [INFO] [stderr] --> src/can/mod.rs:30:18 [INFO] [stderr] | [INFO] [stderr] 30 | for i in 0..data.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ help: try replacing the loop by: `m.data[..data.len()].clone_from_slice(&data[..])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::manual_memcpy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_memcpy [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `input_files`. [INFO] [stderr] --> src/lib.rs:20:14 [INFO] [stderr] | [INFO] [stderr] 20 | for i in 0..(input_files.len()) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 20 | for in &input_files { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/lib.rs:22:35 [INFO] [stderr] | [INFO] [stderr] 22 | imposter.load_stub(fname).expect(&format!("Failed to load stub from {}", fname)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!("Failed to load stub from {}", fname))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `imposter::Imposter` [INFO] [stderr] --> src/imposter.rs:12:5 [INFO] [stderr] | [INFO] [stderr] 12 | / pub fn new() -> Imposter { [INFO] [stderr] 13 | | Imposter { stubs: Vec::new() } [INFO] [stderr] 14 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 6 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use `&Box`. Consider using just `&T` [INFO] [stderr] --> src/imposter.rs:42:47 [INFO] [stderr] | [INFO] [stderr] 42 | pub fn handle_message(&mut self, adaptor: &Box, message: &CANMessage) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: try: `&CANAdaptor` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::borrowed_box)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#borrowed_box [INFO] [stderr] [INFO] [stderr] warning: defining a method called `from_str` on this type; consider implementing the `std::str::FromStr` trait or choosing a less ambiguous name [INFO] [stderr] --> src/stub.rs:26:5 [INFO] [stderr] | [INFO] [stderr] 26 | / pub fn from_str(s: &str) -> Result { [INFO] [stderr] 27 | | let def: StubDefinition = serde_json::from_str(s).expect("Failed to parse JSON"); [INFO] [stderr] 28 | | Ok(Stub { def, response_idx: 0, response_repeats: 0 }) [INFO] [stderr] 29 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::should_implement_trait)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/stub.rs:32:45 [INFO] [stderr] | [INFO] [stderr] 32 | let mut file = File::open(filename).expect(&format!("Failed to open file {}", filename)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!("Failed to open file {}", filename))` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::expect_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/stub.rs:34:44 [INFO] [stderr] | [INFO] [stderr] 34 | file.read_to_string(&mut contents).expect(&format!("Failed to read file {}", filename)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!("Failed to read file {}", filename))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/stub.rs:39:45 [INFO] [stderr] | [INFO] [stderr] 39 | self.def.predicates.iter().find(|p| p.eval(message) == false).is_none() [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!p.eval(message)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/stub.rs:43:12 [INFO] [stderr] | [INFO] [stderr] 43 | if self.def.responses.len() == 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `self.def.responses.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: writing `&String` instead of `&str` involves a new object where a slice will do. [INFO] [stderr] --> src/predicate.rs:35:55 [INFO] [stderr] | [INFO] [stderr] 35 | pub fn matches_template(message: &CANMessage, id: &String, data: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^ help: change this to: `&str` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::ptr_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be used with non-Vec-based slices. [INFO] [stderr] --> src/predicate.rs:35:70 [INFO] [stderr] | [INFO] [stderr] 35 | pub fn matches_template(message: &CANMessage, id: &String, data: &Vec) -> bool { [INFO] [stderr] | ^^^^^^^^^^^^ help: change this to: `&[String]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/predicate.rs:36:12 [INFO] [stderr] | [INFO] [stderr] 36 | if Predicate::matches_value(id, message.id) == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!Predicate::matches_value(id, message.id)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `data` [INFO] [stderr] --> src/predicate.rs:39:18 [INFO] [stderr] | [INFO] [stderr] 39 | for i in 0..data.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 39 | for (i, ) in data.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/predicate.rs:40:16 [INFO] [stderr] | [INFO] [stderr] 40 | if Predicate::matches_value(&data[i], message.data[i] as u64) == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!Predicate::matches_value(&data[i], message.data[i] as u64)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: casting u8 to u64 may become silently lossy if types change [INFO] [stderr] --> src/predicate.rs:40:51 [INFO] [stderr] | [INFO] [stderr] 40 | if Predicate::matches_value(&data[i], message.data[i] as u64) == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ help: try: `u64::from(message.data[i])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: methods called `new` usually return `Self` [INFO] [stderr] --> src/can/dummy.rs:9:5 [INFO] [stderr] | [INFO] [stderr] 9 | / pub fn new() -> Result, &'static str> { [INFO] [stderr] 10 | | Ok(Box::new(DummyAdaptor {})) [INFO] [stderr] 11 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_ret_no_self)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_ret_no_self [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `can::CANMessage` [INFO] [stderr] --> src/can/mod.rs:21:5 [INFO] [stderr] | [INFO] [stderr] 21 | / pub fn new() -> CANMessage { [INFO] [stderr] 22 | | unsafe { mem::zeroed() } [INFO] [stderr] 23 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 13 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `data` [INFO] [stderr] --> src/can/mod.rs:30:18 [INFO] [stderr] | [INFO] [stderr] 30 | for i in 0..data.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 30 | for (i, ) in data.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: it looks like you're manually copying between slices [INFO] [stderr] --> src/can/mod.rs:30:18 [INFO] [stderr] | [INFO] [stderr] 30 | for i in 0..data.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ help: try replacing the loop by: `m.data[..data.len()].clone_from_slice(&data[..])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::manual_memcpy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_memcpy [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `input_files`. [INFO] [stderr] --> src/lib.rs:20:14 [INFO] [stderr] | [INFO] [stderr] 20 | for i in 0..(input_files.len()) { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 20 | for in &input_files { [INFO] [stderr] | ^^^^^^ ^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: use of `expect` followed by a function call [INFO] [stderr] --> src/lib.rs:22:35 [INFO] [stderr] | [INFO] [stderr] 22 | imposter.load_stub(fname).expect(&format!("Failed to load stub from {}", fname)); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!("Failed to load stub from {}", fname))` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#expect_fun_call [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 28.66s [INFO] running `"docker" "inspect" "8f412d8c3a3943b9c61a6435c8e09d6eb3e47163fc0c600d5b8ab0b6ca8f45b2"` [INFO] running `"docker" "rm" "-f" "8f412d8c3a3943b9c61a6435c8e09d6eb3e47163fc0c600d5b8ab0b6ca8f45b2"` [INFO] [stdout] 8f412d8c3a3943b9c61a6435c8e09d6eb3e47163fc0c600d5b8ab0b6ca8f45b2