我正在尝试使用clang来分析我正在处理的项目。该项目包括一个相当大的静态库,它作为依赖包含在Xcode中。
我真的很想不要分析依赖项的文件,因为它似乎让clang失败了。这可能吗?我一直在阅读clang文档,但我还没有找到它。
答案 0 :(得分:15)
作为最后的手段,有一个强力选择。
将其添加到文件的开头:
// Omit from static analysis.
#ifndef __clang_analyzer__
将此添加到最后:
#endif // not __clang_analyzer__
和clang --analyze将看不到文件的内容。
答案 1 :(得分:5)
所以,这不是一个真正的答案,但它运作得很好。
我最终做的是提前构建静态库,然后使用scan-build构建项目。由于已经有一个最新版本的静态库,它没有被重建,因此没有被扫描。
但是,我仍然希望得到一个真正的答案。答案 2 :(得分:5)
最后,该选项于2018年实施。
-排除
不要对在此目录中找到的文件运行静态分析器 (您可以多次指定此选项)。可能在以下情况下有用 该项目包含第三方库。
答案 3 :(得分:3)
我不使用XCode,但在linux中使用scan-build,以下内容适用于我。我的情况是,我想对所有第一方非生成代码运行静态分析。但是,我想避免在third_party代码上运行它并生成代码。
在命令行中,当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))