Auto merge of #11766 - dswij:issue-9274, r=blyxyas
`read_zero_byte_vec` refactor for better heuristics Fixes #9274 Previously, the implementation of `read_zero_byte_vec` only checks for the next statement after the vec init. This fails when there is a block with statements that are expanded and walked by the old visitor. This PR refactors so that: 1. It checks if there is a `resize` on the vec 2. It works on blocks properly e.g. This should properly lint now: ``` let mut v = Vec::new(); { f.read(&mut v)?; //~^ ERROR: reading zero byte data to `Vec` } ``` changelog: [`read_zero_byte_vec`] Refactored for better heuristics
This commit is contained in:
commit
e27ebf28e7
3 changed files with 112 additions and 69 deletions
|
|
@ -55,14 +55,6 @@ fn test() -> io::Result<()> {
|
|||
let mut buf = [0u8; 100];
|
||||
f.read(&mut buf)?;
|
||||
|
||||
// should not lint
|
||||
let mut empty = vec![];
|
||||
let mut data7 = vec![];
|
||||
f.read(&mut empty);
|
||||
|
||||
// should not lint
|
||||
f.read(&mut data7);
|
||||
|
||||
// should not lint
|
||||
let mut data8 = Vec::new();
|
||||
data8.resize(100, 0);
|
||||
|
|
@ -75,6 +67,27 @@ fn test() -> io::Result<()> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn test_nested() -> io::Result<()> {
|
||||
let cap = 1000;
|
||||
let mut f = File::open("foo.txt").unwrap();
|
||||
|
||||
// Issue #9274
|
||||
// Should not lint
|
||||
let mut v = Vec::new();
|
||||
{
|
||||
v.resize(10, 0);
|
||||
f.read(&mut v)?;
|
||||
}
|
||||
|
||||
let mut v = Vec::new();
|
||||
{
|
||||
f.read(&mut v)?;
|
||||
//~^ ERROR: reading zero byte data to `Vec`
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn test_futures<R: AsyncRead + Unpin>(r: &mut R) {
|
||||
// should lint
|
||||
let mut data = Vec::new();
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ error: reading zero byte data to `Vec`
|
|||
--> $DIR/read_zero_byte_vec.rs:21:5
|
||||
|
|
||||
LL | f.read_exact(&mut data).unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `data.resize(20, 0); f.read_exact(&mut data).unwrap();`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `data.resize(20, 0); f.read_exact(&mut data)`
|
||||
|
|
||||
= note: `-D clippy::read-zero-byte-vec` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::read_zero_byte_vec)]`
|
||||
|
|
@ -11,19 +11,19 @@ error: reading zero byte data to `Vec`
|
|||
--> $DIR/read_zero_byte_vec.rs:27:5
|
||||
|
|
||||
LL | f.read_exact(&mut data2)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `data2.resize(cap, 0); f.read_exact(&mut data2)?;`
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `data2.resize(cap, 0); f.read_exact(&mut data2)`
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:32:5
|
||||
|
|
||||
LL | f.read_exact(&mut data3)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:37:5
|
||||
--> $DIR/read_zero_byte_vec.rs:37:13
|
||||
|
|
||||
LL | let _ = f.read(&mut data4)?;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:43:9
|
||||
|
|
@ -38,28 +38,34 @@ LL | f.read(&mut data6)
|
|||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:81:5
|
||||
--> $DIR/read_zero_byte_vec.rs:84:9
|
||||
|
|
||||
LL | f.read(&mut v)?;
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:94:5
|
||||
|
|
||||
LL | r.read(&mut data).await.unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:86:5
|
||||
--> $DIR/read_zero_byte_vec.rs:99:5
|
||||
|
|
||||
LL | r.read_exact(&mut data2).await.unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:93:5
|
||||
--> $DIR/read_zero_byte_vec.rs:106:5
|
||||
|
|
||||
LL | r.read(&mut data).await.unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: reading zero byte data to `Vec`
|
||||
--> $DIR/read_zero_byte_vec.rs:98:5
|
||||
--> $DIR/read_zero_byte_vec.rs:111:5
|
||||
|
|
||||
LL | r.read_exact(&mut data2).await.unwrap();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
error: aborting due to 11 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue