about summary refs log tree commit diff
path: root/src/tools/clippy/tests/ui/read_zero_byte_vec.rs
blob: 720276cb55488402623f37dfe486ed2e061f1bbb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#![warn(clippy::read_zero_byte_vec)]
#![allow(
    clippy::unused_io_amount,
    clippy::needless_pass_by_ref_mut,
    clippy::slow_vector_initialization
)]
use std::fs::File;
use std::io;
use std::io::prelude::*;
//@no-rustfix
//@require-annotations-for-level: WARN
extern crate futures;
use futures::io::{AsyncRead, AsyncReadExt};
use tokio::io::{AsyncRead as TokioAsyncRead, AsyncReadExt as _, AsyncWrite as TokioAsyncWrite, AsyncWriteExt as _};

fn test() -> io::Result<()> {
    let cap = 1000;
    let mut f = File::open("foo.txt").unwrap();

    // should lint
    let mut data = Vec::with_capacity(20);
    f.read_exact(&mut data).unwrap();
    //~^ ERROR: reading zero byte data to `Vec`
    //~| NOTE: `-D clippy::read-zero-byte-vec` implied by `-D warnings`

    // should lint
    let mut data2 = Vec::with_capacity(cap);
    f.read_exact(&mut data2)?;
    //~^ ERROR: reading zero byte data to `Vec`

    // should lint
    let mut data3 = Vec::new();
    f.read_exact(&mut data3)?;
    //~^ ERROR: reading zero byte data to `Vec`

    // should lint
    let mut data4 = vec![];
    let _ = f.read(&mut data4)?;
    //~^ ERROR: reading zero byte data to `Vec`

    // should lint
    let _ = {
        let mut data5 = Vec::new();
        f.read(&mut data5)
        //~^ ERROR: reading zero byte data to `Vec`
    };

    // should lint
    let _ = {
        let mut data6: Vec<u8> = Default::default();
        f.read(&mut data6)
        //~^ ERROR: reading zero byte data to `Vec`
    };

    // should not lint
    let mut buf = [0u8; 100];
    f.read(&mut buf)?;

    // should not lint
    let mut data8 = Vec::new();
    data8.resize(100, 0);
    f.read_exact(&mut data8)?;

    // should not lint
    let mut data9 = vec![1, 2, 3];
    f.read_exact(&mut data9)?;

    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();
    r.read(&mut data).await.unwrap();
    //~^ ERROR: reading zero byte data to `Vec`

    // should lint
    let mut data2 = Vec::new();
    r.read_exact(&mut data2).await.unwrap();
    //~^ ERROR: reading zero byte data to `Vec`
}

async fn test_tokio<R: TokioAsyncRead + Unpin>(r: &mut R) {
    // should lint
    let mut data = Vec::new();
    r.read(&mut data).await.unwrap();
    //~^ ERROR: reading zero byte data to `Vec`

    // should lint
    let mut data2 = Vec::new();
    r.read_exact(&mut data2).await.unwrap();
    //~^ ERROR: reading zero byte data to `Vec`
}

fn allow_works<F: std::io::Read>(mut f: F) {
    let mut data = Vec::with_capacity(100);
    #[allow(clippy::read_zero_byte_vec)]
    f.read(&mut data).unwrap();
}

fn main() {}

fn issue15575() -> usize {
    use std::io::Read;
    use std::net::TcpListener;

    let listener = TcpListener::bind("127.0.0.1:9010").unwrap();
    let mut stream_and_addr = listener.accept().unwrap();
    let mut buf = Vec::with_capacity(32);
    let num_bytes_received = stream_and_addr.0.read(&mut buf).unwrap();
    //~^ read_zero_byte_vec

    let cap = 1000;
    let mut buf = Vec::with_capacity(cap);
    let num_bytes_received = stream_and_addr.0.read(&mut buf).unwrap();
    //~^ read_zero_byte_vec

    let cap = 1000;
    let mut buf = Vec::with_capacity(cap);
    let num_bytes_received = { stream_and_addr.0.read(&mut buf) }.unwrap();
    //~^ read_zero_byte_vec

    use std::fs::File;
    let mut f = File::open("foo.txt").unwrap();
    let mut data = Vec::with_capacity(100);
    f.read(&mut data).unwrap()
    //~^ read_zero_byte_vec
}