2009-05-13 19 views
15

私が作業しているプロジェクトのプロファイルにclangを使用しようとしています。このプロジェクトには、かなり大きな静的ライブラリが含まれています。これは依存関係としてXcodeに含まれています。特定のファイルを分析しないように指示できますか?

clangが失敗するように見えるので、私は本当に依存関係のファイルを解析しないようにしたいと思います。これは可能ですか?私はclangのドキュメントを読んできましたが、見つけられませんでした。

+0

Appleはhttp://devforums.apple.comでNDAの下でリリースされた製品の機密議論のためのまともなフォーラムを持っていますこのような質問には、アップルの人々や他の開示された開発者が回答することができます。 – cdespinosa

+0

(実際に公開されているhttp://clang.llvm.org/StaticAnalysis.htmlのscan-buildツールを使用しない限り、分析するソースファイルのリストを表示するだけですそのページの基本的な使用法) – cdespinosa

+0

私はちょうどスキャンビルドツールについて話しています。残念ながら、基本的な使用法の下では、分析からファイルを除外することについて何も持っていません。プロジェクトでスキャンビルドを使用している場合、デフォルトでは、大規模な静的ライブラリを含め、そのプロジェクト内のすべてのファイルが分析されます。 –

答えて

4

これは実際の回答ではありませんが、十分に機能しました。

最後に、スタティックライブラリを構築してから、スキャンビルドを使用してプロジェクトを構築しました。静的ライブラリの最新のビルドが既に存在していたため、再構築されずスキャンされませんでした。

私はまだこのために本当の答えを持っているのが好きです。

13

最後の手段として、ブルートフォースオプションがあります。

は、ファイルの先頭にこれを追加します。

// Omit from static analysis. 
#ifndef __clang_analyzer__ 

は最後にこれを追加します。ファイルの内容は表示されません--analyze

#endif // not __clang_analyzer__ 

と打ち鳴らすに。

参照:Controlling Static Analyzer Diagnostics

+1

これは、静的ライブラリのすべてのソースファイルにこのマクロを設定する必要があることを意味します。それは管理可能なIMOではありません。私はiOSプロジェクトにCocoaPodを使っているので、私は自分の依存関係を一切変更しません。 –

1

私はXCodeのを使用していますが、私のためのLinuxで、次の作品をスキャンビルドを使用しないでください。私のケースでは、私はすべてのファーストパーティーの非生成コードで静的解析を実行したいと思います。しかし、私はthird_partyコードと生成されたコードでそれを実行しないようにしたい。

scan-buildがCCおよびCXX環境変数をccc-analyzerおよびC++アナライザの場所に設定すると、コマンドラインでclang-analyzerがビルドにフックされます。私は、ccc-analyzer.pyとC++ - analyzer.pyという2つの簡単なスクリプトを書いて、デフォルトの代わりにコンパイルするようにしました。これらのラッパースクリプトでは、コンパイルされているファイルのパスを見て、そのままコンパイラを実行してください(静的解析を避けたい場合)またはc * -analyzer(静的解析を実行したい場合)を実行します。私のスクリプトはPythonであり、私の具体的なビルドシステムに結び付けられますが、修正が必要な例として:

import subprocess 
import sys 

def main(argv): 
    is_third_party_code = False 
    for i in range(len(argv)): 
    arg = argv[i] 
    if arg == '-c': 
     file_to_compile = argv[i + 1] 
     if '/third_party/' in file_to_compile or \ 
      file_to_compile.startswith('gen/'): 
     is_third_party_code = True 
     break 
    if is_third_party_code: 
    argv[0] = '/samegoal/bin/clang++' 
    else: 
    argv[0] = '/samegoal/scan-build/c++-analyzer' 
    return subprocess.call(argv) 

if __name__ == '__main__': 
    sys.exit(main(sys.argv))