Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::empty_loop: empty `loop {}` wastes CPU cycles
What it meansChecks for empty loop expressions. It is in the suspicious group and warns by default.
What you see
warning: empty `loop {}` wastes CPU cycles --> main.rs:3:1 | 3 | loop {} | ^^^^^^^ | = help: you should either use `panic!()` or add `std::thread::sleep(..);` to the loop body = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#empty_loop = note: `#[warn(clippy::empty_loop)]` 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?
These busy loops burn CPU cycles without doing anything. It is almost always a better idea to panic! than to have a busy loop. If panicking isn’t possible, think of the environment and either: block on something sleep the thread for some microseconds yield or pause the thread For std targets, this can be done with std::thread::sleep or std::thread::yield_now. For no_std targets, doing this is more complicated, especially because #[panic_handler]s can’t panic. To stop/pause the thread, you will probably need to invoke some target-specific intrinsic. Examples include: x86_64::instructions::hlt cortex_m::asm::wfi
Code that is most likely wrong or useless. Warns by default.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
loop {}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::empty_loop)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
empty_loop = "allow"One run
cargo clippy -- -A clippy::empty-loopThe [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 empty loop expressions.
Why is this bad?
These busy loops burn CPU cycles without doing
anything. It is almost always a better idea to panic! than to have
a busy loop.
If panicking isn’t possible, think of the environment and either:
- block on something
- sleep the thread for some microseconds
- yield or pause the thread
For std targets, this can be done with
std::thread::sleep
or std::thread::yield_now.
For no_std targets, doing this is more complicated, especially because
#[panic_handler]s can’t panic. To stop/pause the thread, you will
probably need to invoke some target-specific intrinsic. Examples include:
Example
loop {}
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- empty_docsempty doc comment
- empty_line_after_doc_commentsempty line after doc comment
- empty_line_after_outer_attrempty line after outer attribute
- float_equality_without_absfloat equality check without `.abs()`
- for_unbounded_rangefor loop on unbounded range
- forget_non_dropcall to `std::mem::forget` with a value that does not implement `Drop`. Forgetting such a type is the same as dropping it
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::empty_docsempty doc commentRead it next →Did this answer your question?