23

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

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

4

4 回答 4

15

作为最后的手段,有一个蛮力选项。

将此添加到文件的开头:

// Omit from static analysis.
#ifndef __clang_analyzer__

将此添加到末尾:

#endif // not __clang_analyzer__

并且 clang --analyze 不会看到文件的内容。

参考:控制静态分析器诊断

于 2011-03-10T20:32:41.630 回答
6

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

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

不过,我仍然希望对此有一个真正的答案。

于 2009-05-22T23:55:53.810 回答
6

最后,在 2018 年实施了该选项。

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

- 排除

不要针对在此目录中找到的文件运行静态分析器(您可以多次指定此选项)。当项目包含 3rd 方库时可能很有用。

于 2020-04-02T05:31:39.997 回答
3

我不使用 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))
于 2013-01-07T21:52:47.403 回答