Clippy lints / Correctness
Clippy lint · Correctness · checked with Clippy 0.1.99
clippy::unused_io_amount: written amount is not handled
What it meansChecks for unused written/read amount. It is in the correctness group and denied by default (the build fails).
What you see
error: written amount is not handled --> main.rs:5:5 | 5 | w.write(b"foo")?; | ^^^^^^^^^^^^^^^^ | = help: use `Write::write_all` instead, or handle partial writes = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#unused_io_amount = note: `#[deny(clippy::unused_io_amount)]` on by default
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
io::Write::write(_vectored) and io::Read::read(_vectored) are not guaranteed to process the entire buffer. They return how many bytes were processed, which might be smaller than a given buffer’s length. If you don’t need to deal with partial-write/read, use write_all/read_exact instead. When working with asynchronous code (either with the futures crate or with tokio), a similar issue exists for AsyncWriteExt::write() and AsyncReadExt::read() : these functions are also not guaranteed to process the entire buffer. Your code should either handle partial-writes/reads, or call the write_all/read_exact methods on those traits instead.
Code that is almost certainly wrong. Denied by default: the build fails until you fix it or allow it.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
use std::io;
fn foo<W: io::Write>(w: &mut W) -> io::Result<()> {
w.write(b"foo")?;
Ok(())
}
Write this instead
use std::io;
fn foo<W: io::Write>(w: &mut W) -> io::Result<()> {
w.write_all(b"foo")?;
Ok(())
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::unused_io_amount)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
unused_io_amount = "allow"One run
cargo clippy -- -A clippy::unused-io-amountThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for unused written/read amount.
Why is this bad?
io::Write::write(_vectored) and
io::Read::read(_vectored) are not guaranteed to
process the entire buffer. They return how many bytes were processed, which
might be smaller
than a given buffer’s length. If you don’t need to deal with
partial-write/read, use
write_all/read_exact instead.
When working with asynchronous code (either with the futures
crate or with tokio), a similar issue exists for
AsyncWriteExt::write() and AsyncReadExt::read() : these
functions are also not guaranteed to process the entire
buffer. Your code should either handle partial-writes/reads, or
call the write_all/read_exact methods on those traits instead.
Known problems
Detects only common patterns.
Examples
use std::io;
fn foo<W: io::Write>(w: &mut W) -> io::Result<()> {
w.write(b"foo")?;
Ok(())
}
Use instead:
use std::io;
fn foo<W: io::Write>(w: &mut W) -> io::Result<()> {
w.write_all(b"foo")?;
Ok(())
}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- unit_hashDetects ().hash(_)
- unit_return_expecting_ordthis closure returns the unit type which also implements Ord
- unsound_collection_transmutetransmute from `std::vec::Vec<u16>` to `std::vec::Vec<u32>` with mismatched layout is unsound
- useless_attributeChecks for extern crate and use items annotated with lint attributes. This lint permits lint attributes for lints emitted on the items themself. For use items these lints are: ambiguous_glob_reexports dead_code deprecated hidden_glob_reexports unreachable_pub unused unused_braces unused_import_braces clippy::disallowed_types clippy::enum_glob_use clippy::macro_use_imports clippy::module_name_repetitions clippy::redundant_pub_crate clippy::single_component_path_imports clippy::unsafe_removed_from_name clippy::wildcard_imports For extern crate items these lints are: unused_imports on items with #[macro_use]
- vec_resize_to_zeroFinds occurrences of Vec::resize(0, an_int)
- while_immutable_conditionvariables in the condition are not mutated in the loop body
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::unit_hashDetects ().hash(_)Read it next →Did this answer your question?