web-dev-qa-db-ja.com

コマンドラインからClang Static Analyzerの出力を機能させるにはどうすればよいですか?

Ubuntu 12.10でClang 3.4を実行しています( http://llvm.org/apt/ から)。アナライザー(clang --analyze)をいくつかのコードで実行したところ、いくつかの問題が見つかりました。

Blah.C:429:9: warning: Declared variable-length array (VLA) has zero size
        unsigned char separatedData[groupDataLength];
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~

しかし、特定の問題は重要ではありません。その結論に至るまでの手順を知りたい(コードは15分以内に表示されないほど複雑なコードです)。

Webブラウザで表示された作業手順を示すClangサイトのスクリーンショットが表示されます。

screenshot

それはおそらくXcodeから取得されます。

問題は次のとおりです。コマンドラインからClangにそのような作業手順を出力させるにはどうすればよいですか?または、必要に応じてブラウザに結果を出力することもできますか?これにより、アナライザが大幅に便利になり、修正がより迅速になります。

(GCCのドキュメントは非常に優れていることに気づきましたが、Clang/LLVMのドキュメントは非常に貧弱です。 "clang --analyze -Xanalyzer '-v'"をスタブとして試してみて、アナライザーに冗長であることを伝えました--Xanalyzerスイッチは、manページからのものでした。)

17
Jetski S-type

コンソールのテキスト出力に加えて:

clang++ --analyze -Xanalyzer -analyzer-output=text main.cpp

完全なhtml出力を取得できます。

clang++ --analyze -Xanalyzer -analyzer-output=html -o html-dir main.cpp

さらに、特定のチェッカーを選択して有効にすることができます。 このページ 使用可能なチェックをリストします。たとえば、次のフラグを使用して、アルファグループのすべてのC++チェックを有効にできます。

-Xanalyzer -analyzer-checker=alpha.cplusplus

http://coliru.stacked-crooked.com/a/7746c4004704d4a7

main.cpp:5:1: warning: Potential leak of memory pointed to by 'x'
}
^
main.cpp:4:12: note: Memory is allocated
  int *x = new int;
           ^~~~~~~
main.cpp:5:1: note: Potential leak of memory pointed to by 'x'
}
^

どうやらフロントエンドが露出している

-analyzer-config <オプション名> = <値>

例えば。

-analyzer-config -analyzer-checker=alpha.cplusplus

これは-Xanalyzerよりもサポートされている可能性があり、個々のチェッカーのオプションをサポートするように拡張される可能性があります。 http://lists.cs.uiuc.edu/pipermail/cfe-dev/2014-October/039552 .html

22
bames53

あなたは正しい軌道に乗っていますが、バグにつながる完全なトレースを取得するには、clangにテキスト形式の出力を要求する必要があります(理由は尋ねないでください)。あなたはおそらく例えば調整する必要があるのでとにかく、プロジェクトのパスまたは定義を含めます。clangのアナライザーパスのラッパーとして機能するclang-checkを使用することをお勧めします。また、たとえば、で公開されている静的アナライザーツールにフックすることもできます。 scan-build。次にできます

$ clang-check -analyze -extra-arg -Xclang -extra-arg -analyzer-output=text

あなたがこれらの非常に素晴らしいツールのドキュメントを書いたように、ひどいです。私は上記のコールをビットからまとめました Chandler CarruthのGoingNative2013トーク からの断片。

7

Scanbuildを使用する必要があります: http://clang-analyzer.llvm.org/scan-build.html

ビルドを生成するコマンドを入力しますが、それらの前にscan-buildを付加します。

例:代わりに

make

タイプ

scan-build make

の代わりに

./configure
make

タイプ

scan-build ./configure
scan-build make

アナライザーを起動する前にビルドをクリアします。それ以外の場合、makeはすべてが既にビルドされており、アナライザーが実行されないことを示します。

3
Paolo Brandoli