full, rt-multi-thread, macros, sync, etc.). Missing features cause confusing compile errors.#[tokio::main] or manual runtime construction used? Multi-thread vs current-thread?std::fs, std::net, std::thread::sleep, CPU-heavy loops in async functions.Complete in order for the review scope. Do not assert Critical or Major until the relevant gate passes.
Cargo.toml that supplies tokio. Pass: Written note of tokio version and enabled features, or explicit statement that there is no direct tokio dependency and where it comes from (workspace/path).#[tokio::main], Runtime::builder, tests, or library with no owned runtime). Pass: One line naming flavor (multi_thread / current_thread / tests-only / none) and where it is defined.std::fs::, std::net:: without async wrappers, std::thread::sleep, heavy CPU loops in async fn). Pass: Each hit listed as path:line (or tool output excerpt), or explicit “no blocking patterns found in reviewed async code” after the search.Report findings as:
[FILE:LINE] ISSUE_TITLE
Severity: Critical | Major | Minor | Informational
Description of the issue and why it matters.
| Issue Type | Reference |
|---|---|
| ------------ | ----------- |
| Task spawning, JoinHandle, structured concurrency | references/task-management.md |
| Mutex, RwLock, Semaphore, Notify, Barrier | references/sync-primitives.md |
| mpsc, broadcast, oneshot, watch channel patterns | references/channels.md |
| Pin, cancellation, Future internals, select!, blocking bridge | references/pinning-cancellation.md |
multi_thread for I/O-bound, current_thread for simpler cases)#[tokio::test] used for async tests (not manual runtime construction)spawn return values (JoinHandle) are tracked, not silently droppedspawn_blocking used for CPU-heavy or synchronous I/O operationsCancellationToken, select!, or shutdown channels)JoinError (task panic or cancellation) is handled, not just unwrappedtokio::select! branches are cancellation-safeasync fn in traits used instead of async-trait crate where possible (stable since Rust 1.75)-> impl Future now captures all in-scope lifetimes in edition 2024tokio::sync::Mutex used when lock is held across .await; std::sync::Mutex for short non-async sectionsSemaphore used for limiting concurrent operations (not ad-hoc counters)RwLock used when read-heavy workload (many readers, infrequent writes)Notify used for simple signaling (not channel overhead)std::sync::LazyLock used instead of once_cell::sync::Lazy or lazy_static! for runtime-initialized singletons (stable since Rust 1.80)if let lock guard patterns reviewed for edition 2024 temporary scoping — temporaries drop earlier, may change borrow validitySendError / RecvError handled (indicates other side dropped)Lagged errors handled (receiver fell behind)tokio::time::sleep used instead of std::thread::sleeptokio::time::timeout wraps operations that could hangtokio::time::interval used correctly (.tick().await for periodic work)std::fs::read, std::net::TcpStream) in async context without spawn_blocking.await point (deadlock potential)std::thread::sleep in async function (blocks runtime thread)JoinHandle silently dropped (lost errors, zombie tasks)select! cancellation safety considerationtokio::spawn for trivially small async blocks (overhead > benefit)#[tokio::main] sufficesstd::sync::Mutex where contention is high enough to benefit from tokio's async mutextokio-util utilities (e.g., CancellationToken)JoinSetasync-trait crate to native async fn in traitsonce_cell / lazy_static to std::sync::LazyLock#[expect(lint)] instead of #[allow(lint)] for self-cleaning suppressionstd::sync::Mutex for short critical sections — tokio docs recommend this when no .await is inside the locktokio::spawn without explicit join — Valid for background tasks with proper shutdown signaling#[tokio::main(flavor = "current_thread")] in simple binaries — Not every app needs multi-thread runtimeclone() on Arc before spawn — Required for moving into tasks, not unnecessary cloningasync fn in traits without async-trait — Stable since 1.75; the crate is still valid for dyn dispatch cases+ use<'a> on -> impl Future returns — Correct edition 2024 precise capture syntax to limit lifetime capture#[expect(clippy::type_complexity)] on complex async types — Self-cleaning alternative to #[allow], warns when suppression is no longer neededAfter Gates, apply the review-verification-protocol skill to every reported issue (evidence and dispositions per that skill).
共 4 个版本