我正在尝试使用 clang 来分析我正在从事的项目。该项目包括一个相当大的静态库,它作为依赖项包含在 Xcode 中。
我真的希望 clang 不分析依赖项的文件,因为它似乎使 clang 失败。这可能吗?我一直在阅读clang文档,但我没有找到它。
作为最后的手段,有一个蛮力选项。
将此添加到文件的开头:
// Omit from static analysis.
#ifndef __clang_analyzer__
将此添加到末尾:
#endif // not __clang_analyzer__
并且 clang --analyze 不会看到文件的内容。
参考:控制静态分析器诊断
所以,这不是一个真正的答案,但它工作得很好。
我最终做的是提前构建静态库,然后使用 scan-build 构建项目。由于静态库已经有一个最新的构建,它没有被重建,因此没有被扫描。
不过,我仍然希望对此有一个真正的答案。
我不使用 XCode,但在 linux 中使用 scan-build 以下对我有用。我的情况是,我想对所有第一方非生成代码运行静态分析。但是,我想避免在第三方代码和生成的代码上运行它。
在命令行上,当 scan-build 将 CC 和 CXX 环境变量设置为 ccc-analyzer 和 c++-analyzer 位置时,clang-analyzer 会挂接到构建中。我编写了两个名为 ccc-analyzer.py 和 c++-analyzer.py 的简单脚本,并将它们连接到编译器中以代替默认值。在这些包装脚本中,我只是查看了正在编译的文件的路径,然后直接运行原始编译器(如果我希望避免静态分析)或 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))