web-dev-qa-db-ja.com

Objective-C開発のClang警告フラグ

CとObjective-Cのプログラマーとして、私はコンパイラー警告フラグに少し偏執的です。
私は通常、使用するコンパイラの警告フラグの完全なリストを見つけようとしますが、実際にオンにしない十分な理由がない限り、ほとんどのフラグをオンにします。

個人的には、これにより実際にコーディングスキルが向上するだけでなく、潜在的なコードの移植性が向上し、一部の問題が回避される可能性があると考えています。

私の意見では、経験豊富なプログラマーでも、毎日の学習ツールとしては良いと思います。

この質問の主観的な部分について、私はこのトピックについて他の開発者(主にC、Objective-C、C++)を聞くことに興味があります。
実際に注意深い警告などのことについて気にしていますか?はいまたはいいえの場合、なぜですか?

Objective-Cについて、私は最近、完全にGCCではなく [〜#〜] llvm [〜#〜] ツールチェーン(Clangを使用)に切り替えました。

私のプロダクションコードでは、通常この警告フラグを設定します(-Wallでカバーされている場合でも、明示的に):

  • -壁
  • -Wbad-function-cast
  • -Wcast-align
  • -Wconversion
  • -宣言後の宣言
  • -Wdeprecated-implementations
  • -ウェクストラ
  • -Wfloat-equal
  • -Wformat = 2
  • -Wformat-nonliteral
  • -Wfour-char-constants
  • -Wimplicit-atomic-properties
  • -ブッシングブレース
  • -Wmissing-declarations
  • -Wmissing-field-initializers
  • -Wmissing-format-attribute
  • -Wmissing-noreturn
  • -Wmissing-prototypes
  • -Wnested-externs
  • -Wnewline-eof
  • -Wold-style-definition
  • -Woverlength-strings
  • -かっこ
  • -Wpointer-arith
  • -Wundundant-decls
  • -返却タイプ
  • -Wsequence-point
  • -Wshadow
  • -Wshorten-64-to-32
  • -Wsign-compare
  • -Wsign変換
  • -Wstrict-prototypes
  • -Wstrict-selector-match
  • -Wswitch
  • -Wswitch-default
  • -Wswitch-enum
  • -Wundeclared-selector
  • -Wuninitialized
  • -不明なプラグマ
  • -到達不能コード
  • -Wunused関数
  • -Wunused-label
  • -Wunused-parameter
  • -使用されていない値
  • -Wunused-variable
  • -Wwrite-strings

他の開発者がこれについて何を言わなければならないか聞いてみたいです。

たとえば、Clang(Objective-C)の特定のフラグを逃したと思いますか、そしてなぜですか?
または、特定のフラグが役に立たない(またはまったく必要ない)と思いますか、そしてなぜですか?

[〜#〜]編集[〜#〜]

質問を明確にするために、-Wallは、いくつかの基本的な警告のみを提供します。
これらは実際にはもっと多くの警告フラグであり、-Wall、それゆえ質問、そして私が提供するリスト。

92
Macmade

私はClangを使用しませんが、私の意見も気にしないでください。また、最大の警告レベル(-Wallが意味するものだと思います)と警告をエラーとして扱う(-Werrorが意味するものだと思います)とし、あまり意味のない警告のみを無効にします。実際、C#コンパイラーによって特定の非常に有用な警告が発行されず、それらを表示するには特別なコード分析ツールを実行する必要があるという事実に私はかなり苛立っています。私の警告は、コード内の小さな間違いやバグを見つけるのに役立つので、気に入っています。私はそれらがとても好きで、正しいことがわかっているコードの一部に対して警告が出されたときに、とにかくそのコードをリファクタリングして、警告を無効にするのではなく、警告を出さないようにします。さらに悪いことに、それを表示させて無視します。警告は素晴らしいと思うので、もっと警告があればいいのに。

3
Mike Nakis

一般的に、私はより多くの-Wallに傾いており、間違いなく-Werrorも含めると信じています。モジュールはneverに予期された警告を表示する必要があります。最終的に別の警告が表示され、見落とされます。そして、それが実際に問題になるのです。

また、新しいプロジェクトと古いプロジェクトのどちらに「-Wall -Werror」を追加するかによっても異なります。それが新しい場合は、それを求めて完璧を求めてください。そうでなければ、おそらく数日または数週間の編集とテストを行っています。古いやや小規模なプロジェクトでこれを行っただけで、2〜3日かけて警告を削除しました。コードは今よりきれいだと思います。

つまり、試してみてください。

ランディ

1
Randy Stegbauer

人々が警告を気にする最も良い証拠は、警告が存在し、広く使用されているという事実だと思います。コンパイル時にエラーが多く検出されるほど良いと私は強く思います。これが広く受け入れられている考えではなかった場合、コンパイラまたはインタープリタにより多くの余裕が与えられるため、誰もが弱い動的型付け言語を使用することになります。逆に、スクリプト言語でもstrictフラグの使用は一般的です。静的に強く型付けされた言語では、人々は-Wall -Werror頻繁ですが、警告が非常に価値があるため、moreでさえ必要な場合が多いため、 Coverity のような静的分析ツールに支払います=その唯一の目的は警告を提供することです。

批判者がいないという意味ではありません。多くの開発者は、警告を長期的に処理するのではなく、短期的に処理すると警告し、根本的な問題を修正しようとはしません。したがって、昨日出会ったこのスニペットのような素敵なコードが表示されます。

node = node; // Shut up compiler warning
1
Karl Bielefeldt

私は通常、新しいプロジェクトにはXcodeのデフォルト設定を使用します。役立つものと迷惑なもののバランスが取れています。警告やその他のコンパイラオプションの特定のリストは、主に個人の好みやプロジェクトの要件に基づいているため、リストを調べて特定の警告について賛成したり反対したりすることには大きな価値はないと思います。それがあなたのために働くなら、素晴らしい。コンパイラーが検出できるはずのエラーが発生したことが判明し、将来のサポートが必要な場合は、コンパイラー・オプションを探して警告し、オンにしてください。

多くのプログラマが提唱していることの1つは、警告がある場合にビルドが正常に完了しないように、「警告をエラーとして扱う」(-Werror)オプションをオンにすることです。

1
Caleb