在项目级别(iOS应用程序)运行clang静态检查程序而不是逐个文件(xcodebuild)

时间:2016-06-20 07:47:58

标签: ios objective-c clang xcodebuild clang-static-analyzer

在解决了这个Omitted code blocks from clang AST for ObjectiveC之后,我在一个小的Objective C .m文件上尝试了它以及一个合适的compile_commands.json,它运行正常,我得到了整个语法树。

现在我试图看看是否可以在整个xcodebuild上运行它

[
  {
    "directory" : "/Users/xx/Desktop/iOSApplication",
    "command" : "xcodebuild clean build CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO -project /Users/xx/Desktop/iOSApplication/iOSApplication.xcodeproj/",
    "file" : "iOSApplication.xcodeproj"
  }
]

当我尝试运行clang-check -ast-dump /Users/xx/Desktop/iOSApplication/iOSApplication.xcodeproj时,它会向我显示错误error: unknown argument: '-project'error: unable to handle compilation, expected exactly one compiler job in ''

是否可以在整个xcodeproject上运行基于AST的检查程序?或者我应该如何一次编译文件1?

2 个答案:

答案 0 :(得分:0)

我已按照此指南http://docs.oclint.org/en/stable/guide/xcodebuild.html

设法生成compile_commands.json

但是,我仍然希望能够在整个项目中运行我的RecursiveASTVisitor。或者,传入xcode项目并枚举所有源文件也可能会起作用。

任何人都有想法如何将整个xcodebuild项目作为RecursiveASTVisitor的参数传递?

现在我正在运行我的ASTVisitor ./MyASTChecker ~/Desktop/directory/sample1.m,但我想让它像./MyASTChecker ~/Desktop/directory/sampleproject.xcodeproj

那样运行

答案 1 :(得分:0)

我这样做的方法是在编译时使用scan-build。这适用于基于cmake / make的项目。

scan-build --use-analyzer=clang -enable-checker <checker_name> make

这将读取makefile并在其中构建所有内容,同时在每个文件上运行指定的检查器,因为它已编译。如果您只想使用某些标志或特定目标进行构建,则可以执行以下操作:

scan-build --use-analyzer=clang -enable-checker <checker_name> make <build_options>

如果你有一个基于cmake的项目。您可能首先要在构建目录中生成makefile。我是这样做的:

cmake <path_to_cmakelists> -DCMAKE_CXX_COMPILER=c++-analyzer -DCMAKE_CC_COMPILER=ccc-analyzer

然后从上面进行scan-build将编译并在编译每个文件时对源文件运行检查器。

我只用CMAKE / MAKE尝试了这个,但应该像这样使用xcode:

scan-build --use-analyzer=clang -enable-checker <checker_name> xcodebuild 

并使用构建选项

scan-build --use-analyzer=clang -enable-checker <checker_name> xcodebuild <build_options>

您可以阅读有关scan-build here

的更多信息