可以告诉clang不要分析某些文件吗?

时间:2009-05-13 09:06:42

标签: xcode profiling clang

我正在尝试使用clang来分析我正在处理的项目。该项目包括一个相当大的静态库,它作为依赖包含在Xcode中。

我真的很想不要分析依赖项的文件,因为它似乎让clang失败了。这可能吗?我一直在阅读clang文档,但我还没有找到它。

4 个答案:

答案 0 :(得分:15)

作为最后的手段,有一个强力选择。

将其添加到文件的开头:

// Omit from static analysis.
#ifndef __clang_analyzer__

将此添加到最后:

#endif // not __clang_analyzer__

和clang --analyze将看不到文件的内容。

参考:Controlling Static Analyzer Diagnostics

答案 1 :(得分:5)

所以,这不是一个真正的答案,但它运作得很好。

我最终做的是提前构建静态库,然后使用scan-build构建项目。由于已经有一个最新版本的静态库,它没有被重建,因此没有被扫描。

但是,我仍然希望得到一个真正的答案。

答案 2 :(得分:5)

最后,该选项于2018年实施。

使用--exclude <path> [1] [2]选项

-排除

不要对在此目录中找到的文件运行静态分析器 (您可以多次指定此选项)。可能在以下情况下有用 该项目包含第三方库。

答案 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))