c++ - 在 CUDA 源文件上使用 clang-tidy

标签 c++ cuda clang static-analysis clang-tidy

存在多种专为 C/C++ 设计的静态分析工具,但它们对于测试 CUDA 源代码并不是特别有用。

clang version 6能够编译 CUDA,我想使用 clang-tidy 检查我的选项,它似乎没有切换架构的选项。

有没有办法让它工作?例如用于打开 CUDA 解析器的编译时开关、自定义检查形式的扩展,或者它可能是计划中的功能?

最佳答案

基于 clang 的工具的一个问题是它们以与 clang 完全相同的方式解析文件。

第一个问题是,与C/C++编译不同,CUDA编译对源码进行了多次编译。默认情况下,当您给它一个 CUDA 文件时,clang 会创建多个编译作业,并且会触发许多只需要一次编译的工具。为了解决这个问题,您需要将 --cuda-host-only 选项传递给 clang-tidy。

您可能还需要传递 --cuda-path=/path/to/your/CUDA/install/root 以便 clang 可以找到 CUDA header 。

您可能遇到的另一个问题与包含路径有关。 Clang 派生的工具没有相同的默认包含 clang 本身使用的路径,并且偶尔会导致奇怪的问题。至少 clang-tidy 需要找到与 clang 一起安装的 __clang_cuda_runtime_wrapper.h。如果您运行 clang-tidy your-file.c -- -v,它将打印 clang 的参数并包括它使用的搜索路径。将其与 clang -x c/dev/null -fsyntax-only -v 打印的内容进行比较。您可能需要为 clang-tidy 提供额外的包含路径,以匹配 clang 本身使用的路径。请注意,您不应在此处显式添加 CUDA 包含的路径。它将被 --cuda-path=... 自动添加到正确的位置。

一旦一切就绪,clang-tidy 应该可以处理 CUDA 文件。

是这样的: clang-tidy your-file.cu -- --cuda-host-only --cuda-path=... -isystem/clang/includes -isystem/extra/system/includes

关于c++ - 在 CUDA 源文件上使用 clang-tidy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361538/

相关文章:

c++ - 通过构造函数将值传递给 std::ifstream

c - 如何确定缓冲区是在 GPU 还是 CPU 上?

c++ - 获取单个文件的 Clang AST

c++ - 我可以扩展一个参数包并用它定义一个参数列表吗?

c++ - ply文件格式的元素面是什么

c++ - 当用户启动注销/关机操作时停止应用程序

c++ - 错误 C2536 : cannot specify explicit initializer for arrays in Visual Studio 2013 的解决方法

c++ - 缺少 cudart64_80.dll

c++ - 从常规 C++ 代码调用 CUDA 代码——整理出 extern "C"

c++ - Clang 无法使用模板元编程编译参数包扩展