【问题标题】:Can clang be told not to analyze certain files?可以告诉clang不要分析某些文件吗?
【发布时间】:2010-10-25 19:22:52
【问题描述】:

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

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

【问题讨论】:

  • Apple 在devforums.apple.com 有一个不错的论坛,用于对根据 NDA 发布的产品进行保密讨论,Apple 人员和其他公开的开发人员可以在其中回答此类问题。
  • (除非你在clang.llvm.org/StaticAnalysis.html询问使用scan-build工具,这确实是公开的。在这种情况下,只需列出你要分析的源文件,如基本用法所示在那个页面上。)
  • 我只是在谈论扫描构建工具。不幸的是,在基本用法下,它没有任何关于从分析中排除文件的内容。如果您在项目上使用 scan-build,默认情况下它会分析该项目中的所有文件,包括我的大型静态库。

标签: xcode profiling clang


【解决方案1】:

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

将此添加到文件的开头:

// Omit from static analysis.
#ifndef __clang_analyzer__

添加到最后:

#endif // not __clang_analyzer__

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

参考:Controlling Static Analyzer Diagnostics

【讨论】:

  • 这意味着我必须在静态库中的每个源文件上设置这个宏,不是吗?这不是 IMO 可管理的。我根本不会修改我的依赖项,因为我将 CocoaPods 用于我的 iOS 项目。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    最终,该选项在 2018 年实施。

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

    --排除

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

    【讨论】:

    • 有没有办法将此选项与clang++ 一起使用?我试过-Xanalyzer --exclude,但它告诉我error: unknown argument: '--exclude'
    【解决方案4】:

    我不使用 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))
    

    【讨论】:

    • 酷,这似乎应该是公认的答案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    相关资源
    最近更新 更多