gccでビルドするプロジェクトの個人コード分析にClangを使用するのは賢明ですか?


8

を使用してビルドしているいくつかのCプロジェクトに取り組み始めましたgcc。この選択はいくつかの理由で行われたと思います:

  • アームの非常に早い段階でクロスコンパイルする必要がありました(私はそう思います)。
  • パフォーマンスは、何よりも重要なスペックです。
  • gcc 以前も今も簡単な最初の選択です。

私はその選択に異議を唱える理由はなく、とにかくそうする立場にはありません。

単一のプロジェクトのコードベースは比較的小さいです。すべてのプロジェクトは比較的クリーンなMakefile(現在更新中)でビルドされ、gcc -Wall -Wextraほとんど文句を言わず、最小限のテストが行​​われます。自動化された静的分析やコードのフォーマットは行われておらず、コードは構文的に一貫性がありませんが、非常に読みやすく、考え抜かれています。

コードのすべての行を一度に再フォーマットしたくないので、この回答の周りのどこかで説明されているように(特にコンテキストが実際にはそれほど悪くないため)行うつもりです:リファクタリングし、主に、トピックを扱うときはできるだけ再フォーマットしますただし、コードスタイルを意識しないでトピックを取り上げます。残念ながら、私はコードスタイルやコミットの追加チェックを課す立場にはありませんが、ファイルを変更するときは既存のコード規則を尊重する必要があるという同僚の感覚があるように感じます(ただし、現在の状態はわかっていますが)コードの魔法のようなことが起こりませんでした)、そして良いコードを書きたいという欲求。

これは、このような心構えでCでプログラミングするのが初めてであり、さまざまなコード分析ツールと書式設定ツールに非常に惹かれていclangます。

したがって、私の質問の要点は次のとおりです。それclangを使用clangしてビルドしているときに、ヒントに従ってフォーマットおよび分析ツールを使用すると問題が発生する可能性がありますgccか?たとえば、一部の警告は、内部表現gccが使用しないか、バイトコードclangが生成しgccないものから発生する可能性があります。

警告ヒントが意味をなすように、gccコンパイルパラメータ(主にターゲットアーキテクチャと最適化レベル)を自動的に渡す良い方法はありclangますか?

私が精通していることgccとそのエラー報告を追加します。私は、より適切な言葉でわかりやすい警告だけでなく、より多くの(関連する)警告とエラーを取得することに関心があります。したがって、1 日の終わりclangに構築するために、その内部表現に基づいて生成できる追加のヒントを信頼できない場合、私はこれを行うことにあまりgcc興味がありません。

私は多くのコンテキストを含めたので、どんな発言をしても、私が持ち出せなかった根本的な質問に気軽に答えてください。


コードの規約に関して、彼はあなたのお気に入りを既存のプロジェクトに押し付けないように注意しています。物事を大幅に改善する可能性は低く、他の貢献者を困らせることができます。ツールの選択についても同様です。実際に実際の改善を行わずに、「正しい」方法でやり直しをするのは非常に簡単です。
beldaz

回答:


9

たとえば、一部の警告は、gccが使用しない内部表現や、gccが使用しないバイトコードclangが生成しようとするものから発生する可能性があります。

非常にありそうもない。Clangはコードが使用する内部表現ではなくコードについて警告します。すべての警告は、clangの実装の詳細ではなく、コードで実行している疑わしい何かから発生するはずです。

問題があるのは、使用しているコードのいずれかが非標準のC ++を使用している場合です。GCCはC ++の多くの拡張機能をサポートしていますが、他のコンパイラーでは受け入れられません。これらのいずれかを使用すると、clangは単にコードのコンパイルを拒否する場合があります。GCCは多くの古いコードのコンパイルをサポートする必要があり、(私が理解しているように)Clangよりもいくつかの点で寛大です。


2

私は仕事でgccとclangの両方を使用しています。もちろん、両方のコンパイラを一緒に使用すると、より多くの警告が表示されます。これは素晴らしいことです。一方、警告は互いに矛盾する可能性があります。

私が見つけた最も厄介なケースは、clangがdefaultルールを検出しswitch、すべての値がすでにカバーされており、gccがdefaultケースがあることを主張している場合です(ここに文書化されています)。ただし、両方のコンパイラで非常に厳密な警告を設定した場合にのみ、この矛盾が発生します。

主観的には、clangはより厳しい警告を受け-Weverythingており、clangアナライザー(静的コードアナライザー)を使用している場合はさらに多くの警告を受け取ることもできます。しかし、gccが発見した重要な警告も出ました。

ほとんどのコンパイラスイッチは、まったく同じ名前です。警告スイッチの名前は異なります。-Wno-*警告を無効にするオプションを使用することにした場合、これは煩わしいかもしれません。私が見る限り、make / cmakeでの条件付きコンパイルを回避することはできませんが、これを解決するのは難しくありません。

自動ツールでコードをフォーマットすることは避けます。非難の出力を汚染するので、それは迷惑です。そして、長時間実行されるマージは非常に困難になる可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.