使用 clang-tidy 分析嵌入式 GCC 项目

MLa*_*paj 7 c++ llvm clang-tidy

我正在尝试使用 clang-tidy 来解析由 arm-none-eabi-g++ 编译的项目。

不幸的是,clang-tidy 无法找到编译器头,即使给出了它们的包含路径。

我的compile_commands.json是

  [   
    {
    "directory": "C:/LMA/repo/clang-tidy",
    "arguments": [
      "arm-none-eabi-c++",
      "-IC:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include/c++/9.2.1",
      "-IC:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include/c++/9.2.1/arm-none-eabi/arm/v5te/hard",
      "test.cpp"
    ],
    "file": "./test.cpp"   } ]
Run Code Online (Sandbox Code Playgroud)

示例 test.cpp 文件是:

#include <cstdint>
#include <cstdlib>

int test()
{
  int temp;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Clang-tidy 显示错误:

C:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include/c++/9.2.1\cstdlib:75:15: error: 'stdlib.h' file not found [clang-diagnostic-error]
#include_next <stdlib.h>
Run Code Online (Sandbox Code Playgroud)

因此,它正确地找到并包含 cstdlib,但是无法找到位于完全相同的文件夹中的 stdint.h。更令人恼火的是,它不包括 stdlib.h,即使我添加

-include C:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include/c++/9.2.1/stdlib.h 到编译器参数以强制预包含。

非常感谢任何如何解决此问题的建议。

Lur*_*pai 2

这有点旧了,但我遇到了类似的问题,所以我想我应该在这里报告答案,以防其他人在搜索时遇到这个问题。看来clang不知道在使用 编译时在哪里找到标准库头文件arm-none-eabi我通过简单地添加它们就成功了

在您的情况下,您仍然缺少 C 头文件目录,因此您需要添加以下内容: C:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include/

(假设目录结构与我的类似)。

所以你compile_commands.json会是:

[ {
  "directory": "C:/LMA/repo/clang-tidy",
  "arguments": [
      "arm-none-eabi-g++",
      "-IC:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include",
      "-IC:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include/c++/9.2.1",
      "-IC:/nxp/MCUXpressoIDE_11.2.1_4149/ide/tools/arm-none-eabi/include/c++/9.2.1/arm-none-eabi/arm/v5te/hard",
      "test.cpp"
  ],
  "file": "./test.cpp"
} ]
Run Code Online (Sandbox Code Playgroud)

你也应该有arm-none-eabi-g++而不是arm-none-eabi-c++我相信。