【问题标题】:Clang static analysis with MPI使用 MPI 进行 Clang 静态分析
【发布时间】:2015-12-03 11:40:58
【问题描述】:

我想使用Clang's static analyzer 来分析并行代码,即需要 MPI 编译器包装器的代码。 但是,在使用 CMake 进行配置时,我总是得到

$ scan-build cmake /path/to/source
-- Check for working CXX compiler: /usr/share/clang/scan-build/c++-analyzer
-- Check for working CXX compiler: /usr/share/clang/scan-build/c++-analyzer -- works

随后的编译 (make) 失败

/usr/include/some/header.hpp:56:17: fatal error: mpi.h: No such file or directory

#include "mpi.h"

这里如何正确使用scan-build

【问题讨论】:

  • 您是否尝试导出 CFLAGS='-I/path/to/mpi.h'?

标签: c++ clang mpi static-analysis clang++


【解决方案1】:

我还没有找到直接将 MPI 编译器包装器与 scan-build 一起使用的方法。但是,您可以绕过包装器并手动将标志提供给编译器。例如这适用于我的环境:

$ export CXXFLAGS=`mpicxx --showme:compile`
$ export LDFLAGS=`mpicxx --showme:link`
$ export CXX=`mpicxx --showme:command`
$ scan-build ./configure && scan-build make #Or your cmake equivalent

--showme: 标志在版本之间似乎略有不同,但mpicc --showme:help 通常会为您提供特定包装器支持的命令列表。

【讨论】:

    【解决方案2】:

    MPI-Checker/examples

    要调用 Clang 静态分析器,建议使用 scan-build 包在 Python 中实现。您可以使用 LLVM 主干中包含的脚本 (llvm/tools/clang/tools/scan-build-py/bin) 或安装脚本 与pip install scan-build。请注意,在 make install LLVM 复制旧 脚本的 Perl 版本到 /usr/local/bin 因此可能 覆盖使用 pip 安装的版本。

    由于 MPI 包装编译器会干扰扫描构建脚本,它 建议调用基于编译数据库的分析, 由intercept-build (make|ninja|...) 生成。请注意,数据库 CMake 生成的可能与intercept-build 生成的不同。 如果 compile_commands.json 文件将 mpicc|mpic++ 表示为使用 编译器,不会发出任何报告。

    编译数据库创建后,可以触发分析 与:
    analyze-build --enable-checker your.check --use-analyzer /path/to/clang

    【讨论】:

      【解决方案3】:

      您的 c 编译器需要有一个 MPI 包装器。这意味着使用 CLang 编译的 MPI 库。完成后,您需要将构建环境中的 c 编译器设置为 mpicc。这应该为您提供正确的包含和链接选项。

      【讨论】:

        猜你喜欢
        • 2012-12-13
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 2010-12-24
        • 1970-01-01
        相关资源
        最近更新 更多