#![deny(warnings)]
説明
善意のあるクレート作者は、自分のコードが警告なしでビルドされることを保証したいと考えます。そこで、クレートルートに次のように注釈を付けます。
例
#![allow(unused)]
#![deny(warnings)]
fn main() {
// すべて問題ありません。
}
利点
短く、何か問題があればビルドを停止します。
欠点
コンパイラーが警告付きでビルドすることを許可しないことで、クレート作者は Rust の名高い安定性から外れることになります。新しい機能や古い不適切な機能によって、物事の行い方を変更する必要が生じることがあります。そのため、一定の猶予期間は warn し、その後 deny に変更される lint が書かれます。
たとえば、ある型が同じメソッドを持つ 2 つの impl を持てることが発見されました。これは悪い考えだと判断されましたが、移行を円滑にするために、将来のリリースでハードエラーになる前に、この事実に遭遇した人へ警告を出す overlapping-inherent-impls lint が導入されました。
また、API が非推奨になることもあり、その使用は以前には存在しなかった警告を発するようになります。
これらすべてが相まって、何かが変更されるたびにビルドが壊れる可能性があります。
さらに、追加の lint を提供するクレート(例: rust-clippy)は、その注釈を削除しない限り使用できなくなります。これは –cap-lints によって緩和されます。--cap-lints=warn コマンドライン引数は、すべての deny lint エラーを警告に変えます。
代替案
この問題に取り組む方法は 2 つあります。第一に、ビルド設定をコードから切り離すことができます。第二に、拒否したい lint を明示的に指定できます。
次のコマンドラインは、すべての警告を deny に設定してビルドします。
RUSTFLAGS="-D warnings" cargo build
これは、個々の開発者が実行できます(または Travis のような CI ツールで設定できます。ただし、何かが変更されたときにビルドが壊れる可能性があることを忘れないでください)。コードの変更は必要ありません。
あるいは、コード内で deny したい lint を指定できます。以下は、(願わくば)拒否しても安全な警告 lint の一覧です(rustc 1.48.0 時点)。
#![deny(
bad_style,
const_err,
dead_code,
improper_ctypes,
non_shorthand_field_patterns,
no_mangle_generic_items,
overflowing_literals,
path_statements,
patterns_in_fns_without_body,
private_in_public,
unconditional_recursion,
unused,
unused_allocation,
unused_comparisons,
unused_parens,
while_true
)]
加えて、次の allow されている lint を deny するのは良い考えかもしれません。
#![deny(
missing_debug_implementations,
missing_docs,
trivial_casts,
trivial_numeric_casts,
unused_extern_crates,
unused_import_braces,
unused_qualifications,
unused_results
)]
リストに missing-copy-implementations を追加したい人もいるかもしれません。
なお、将来さらに多くの非推奨 API が出ることはかなり確実であるため、deprecated lint は明示的に追加していません。
関連項目
- すべての clippy lint のコレクション
- deprecate attribute ドキュメント
- システム上の lint の一覧を表示するには
rustc -W helpと入力してください。また、一般的なオプション一覧を表示するにはrustc --helpと入力してください - rust-clippy は、より良い Rust コードのための lint のコレクションです