-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #11136 - y21:enhance_read_line_without_trim, r=dswij
[`read_line_without_trim`]: detect string literal comparison and `.ends_with()` calls This lint now also realizes that a comparison like `s == "foo"` and calls such as `s.ends_with("foo")` will fail if `s` was initialized by a call to `Stdin::read_line` (because of the trailing newline). changelog: [`read_line_without_trim`]: detect string literal comparison and `.ends_with()` calls r? `@giraffate` assigning you because you reviewed #10970 that added this lint, so this is kinda a followup PR ^^
- Loading branch information
Showing
5 changed files
with
140 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,74 +1,102 @@ | ||
error: calling `.parse()` without trimming the trailing newline character | ||
error: calling `.parse()` on a string without trimming the trailing newline character | ||
--> tests/ui/read_line_without_trim.rs:12:25 | ||
| | ||
LL | let _x: i32 = input.parse().unwrap(); | ||
| ----- ^^^^^^^ | ||
| | | ||
| help: try: `input.trim_end()` | ||
| | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause `.parse()` to fail | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause the checking to always fail | ||
--> tests/ui/read_line_without_trim.rs:11:5 | ||
| | ||
LL | std::io::stdin().read_line(&mut input).unwrap(); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: `-D clippy::read-line-without-trim` implied by `-D warnings` | ||
= help: to override `-D warnings` add `#[allow(clippy::read_line_without_trim)]` | ||
|
||
error: calling `.parse()` without trimming the trailing newline character | ||
error: calling `.parse()` on a string without trimming the trailing newline character | ||
--> tests/ui/read_line_without_trim.rs:16:20 | ||
| | ||
LL | let _x = input.parse::<i32>().unwrap(); | ||
| ----- ^^^^^^^^^^^^^^ | ||
| | | ||
| help: try: `input.trim_end()` | ||
| | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause `.parse()` to fail | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause the checking to always fail | ||
--> tests/ui/read_line_without_trim.rs:15:5 | ||
| | ||
LL | std::io::stdin().read_line(&mut input).unwrap(); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: calling `.parse()` without trimming the trailing newline character | ||
error: calling `.parse()` on a string without trimming the trailing newline character | ||
--> tests/ui/read_line_without_trim.rs:20:20 | ||
| | ||
LL | let _x = input.parse::<u32>().unwrap(); | ||
| ----- ^^^^^^^^^^^^^^ | ||
| | | ||
| help: try: `input.trim_end()` | ||
| | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause `.parse()` to fail | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause the checking to always fail | ||
--> tests/ui/read_line_without_trim.rs:19:5 | ||
| | ||
LL | std::io::stdin().read_line(&mut input).unwrap(); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: calling `.parse()` without trimming the trailing newline character | ||
error: calling `.parse()` on a string without trimming the trailing newline character | ||
--> tests/ui/read_line_without_trim.rs:24:20 | ||
| | ||
LL | let _x = input.parse::<f32>().unwrap(); | ||
| ----- ^^^^^^^^^^^^^^ | ||
| | | ||
| help: try: `input.trim_end()` | ||
| | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause `.parse()` to fail | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause the checking to always fail | ||
--> tests/ui/read_line_without_trim.rs:23:5 | ||
| | ||
LL | std::io::stdin().read_line(&mut input).unwrap(); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: calling `.parse()` without trimming the trailing newline character | ||
error: calling `.parse()` on a string without trimming the trailing newline character | ||
--> tests/ui/read_line_without_trim.rs:28:20 | ||
| | ||
LL | let _x = input.parse::<bool>().unwrap(); | ||
| ----- ^^^^^^^^^^^^^^^ | ||
| | | ||
| help: try: `input.trim_end()` | ||
| | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause `.parse()` to fail | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause the checking to always fail | ||
--> tests/ui/read_line_without_trim.rs:27:5 | ||
| | ||
LL | std::io::stdin().read_line(&mut input).unwrap(); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: aborting due to 5 previous errors | ||
error: comparing a string literal without trimming the trailing newline character | ||
--> tests/ui/read_line_without_trim.rs:38:8 | ||
| | ||
LL | if input == "foo" { | ||
| -----^^^^^^^^^ | ||
| | | ||
| help: try: `input.trim_end()` | ||
| | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause the comparison to always fail | ||
--> tests/ui/read_line_without_trim.rs:37:5 | ||
| | ||
LL | std::io::stdin().read_line(&mut input).unwrap(); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: checking the end of a string without trimming the trailing newline character | ||
--> tests/ui/read_line_without_trim.rs:44:8 | ||
| | ||
LL | if input.ends_with("foo") { | ||
| -----^^^^^^^^^^^^^^^^^ | ||
| | | ||
| help: try: `input.trim_end()` | ||
| | ||
note: call to `.read_line()` here, which leaves a trailing newline character in the buffer, which in turn will cause the parsing to always fail | ||
--> tests/ui/read_line_without_trim.rs:43:5 | ||
| | ||
LL | std::io::stdin().read_line(&mut input).unwrap(); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
|
||
error: aborting due to 7 previous errors | ||
|