#![deny(warnings)]
説明
善意のあるcrate作成者は、自分たちのコードが警告なしでビルドされることを保証したいと考えています。そこで、彼らはcrateのルートに次のようなアノテーションを付けます:
例
#![allow(unused)] #![deny(warnings)] fn main() { // すべてちゃんとしている。 }
長所
これは簡単で、もし何か間違いがあるならビルドが止まります。
欠点
コンパイラが警告ありでビルドすることを禁止することにより、Rustの有名な安定性から、crate作成者が切り離されてしまうことになります。時に、新しい機能や古い問題ある機能により、物事の進め方を変える必要がでてくることがあります。このような場合に、lintは一定の猶予期間 warn
し、その後に deny
に切り替えるように記述されます。
例えば、ある型が同じメソッドを持つ2つのimpl
を持つことができることが発見されました。これは悪いアイデアだと判断されました。しかしスムーズに移行するために、overlapping-inherent-impls
というlintが導入を導入し、将来のリリースで完全なエラーとされる前に、この事実につまずいた人に警告を与えるようにしました。
また、APIが非推奨になることもあります。この場合、それを使用していると、今まで無かった警告が出るようになります。
これらすべてが、何かが変わるたびにビルドを壊してしまう可能性を持っています。
さらに、追加のlintを提供するcrate([rust-clippy]など)は、このアノテーションを削除しない限り使用できなくなりました。これは[--cap-lints]で緩和されます。コマンドライン引数に --cap-lints=warn
を指定すると、すべての deny
lint エラーを警告に変えます。
代替案
この問題に対処する方法は2つあります。一つは、コードからビルド設定を切り離すことです。もう一つは、denyしたい lint を明示的に指定することです。
次のコマンドラインは、すべての警告を deny
に設定してビルドを行います:
RUSTFLAGS="-D warnings" cargo build
これは個々の開発者が(あるいはTravisのようなCIツールでも。ただし変更があったときビルドが壊れる可能性に注意は必要)コードに変更を加えずに行えます。
あるいは、コード中で deny
したいlintを指定することもできます。以下は、(たぶん) 安全にdenyできる警告リントのリストです (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
されたリントを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
をリストに加えたい人もいるでしょう。
deprecated
のlintを明示的に追加していないことに注意してください。将来的に非推奨のAPIが増えることは確実だからです。
See also
- すべての crippy lint
- deprecated属性 のドキュメント
rustc -W help
と入力するとあなたのシステム上の lint のリストが表示されます。またrustc --help
と入力すると一般的なオプションのリストが表示されます- [rust-clippy] はより良い Rust コードのための lint のコレクションです