#![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 のコレクションです
Last change: 2024-07-09, commit: 317c88e