【问题标题】:How to use Clang static analyzer with a Cortex-M project?如何在 Cortex-M 项目中使用 Clang 静态分析器?
【发布时间】:2017-10-27 12:45:52
【问题描述】:

我正在为基于 ARM Cortex-M 的 MCU 开发“裸机”C/C++ 应用程序。 我想将 Clang 静态分析器合并到我的构建系统中。

所以不是

arm-none-eabi-g++ ....

我现在用

scan-build arm-none-eabi-g++ ...

这似乎工作正常,但我收到了一堆关于 CMSIS 头文件和我从芯片制造商那里得到的东西的消息:

  • 错误:从指针转换为更小的类型“uint32_t”(又名“unsigned int”)丢失信息

我同意他们应该使用uintptr_t 而不是int32_t,但也不能重写他们的整个代码库和CMSIS 标头。我可以告诉scan-build,这个平台上的指针实际上是 32 位的,所以不会丢失信息吗?

我试图告诉它考虑我使用哪个平台。但是如果我使用scan-build --analyzer-target=arm-none-eabi,我会得到:

  • 致命错误:找不到“cstring”文件
  • 错误:asm 中的未知寄存器名称“vfpcc”

同样,在 CMSIS 标头中。

我的问题是:

  • 为什么我使用--analyzer-target=arm-none-eabi时分析器找不到cstring标头?
  • 如何告诉分析器我的指针是真正的 32 位?
  • 为什么它会给我关于那个未知寄存器的错误?

或者:

  • 如何消除 CMSIS 标头的警告?

编辑

我也尝试了以下建议,但没有奏效,导致同样的错误:

scan-build
    --use-cc=/usr/bin/arm-none-eabi-gcc
    --use-c++=/usr/bin/arm-none-eabi-g++
    --analyzer-target=arm-none-eabi
    arm-none-eabi-g++ ...

注意:我使用 qbs 构建系统,并使用我的.qbs 文件中的cpp.compilerWrapper 属性生成scan-build 调用。

一个典型的命令如下所示:

/usr/bin/scan-build --use-cc=/usr/bin/arm-none-eabi-gcc --use-c++=/usr/bin/arm-none-eabi-g++ --analyzer-target=arm-none-eabi /usr/bin/arm-none-eabi-g++ -g -O0 -Wall -Wextra -mcpu=cortex-m4 -mfloat-abi=hard -mthumb -mabi=aapcs -mno-sched-prolog -mabort-on-noreturn -fdata-sections -ffunction-sections -fno-strict-aliasing -fno-builtin -specs=nosys.specs -specs=nano.specs -static -nodefaultlibs -Wdouble-promotion -ggdb -g3 -mfpu=fpv4-sp-d16 -pipe -frandom-seed=0x633bf14c -Wdate-time -fno-exceptions -fno-rtti -fvisibility=default -Wall -Wextra -Wpedantic -Wno-unused-function -DS1_USE_SEGGER_RTT -DEFM32WG940F256 -D__HEAP_SIZE=0 -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/common/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/config -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/dmadrv/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/dmadrv/config -I/home/Timur/Projects/MyProject/my-software/dependencies/hardware/kit/common/drivers -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/gpiointerrupt/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/nvm/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/nvm/config -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/rtcdrv/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/rtcdrv/config -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/sleep/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/spidrv/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/spidrv/config -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/uartdrv/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/uartdrv/config -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/ustimer/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emdrv/ustimer/config -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/emlib/inc -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/CMSIS/Include -I/home/Timur/Projects/MyProject/my-software/dependencies/platform/Device/SiliconLabs/EFM32WG/Include -I/home/Timur/Projects/MyProject/my-software/dependencies/RTT -std=c++0x -o /home/Timur/Projects/MyProject/build-myproject-my-software-arm_none_eabi-Debug/qtc_arm_none_a793425c-debug/myproject-my-software.qtc-arm-none-a793425c.7e216384/.obj/e6c416981c959a66/efm32-serial-port.cpp.o -c /home/Timur/Projects/MyProject/my-software/source/utilities/hal/efm32-serial-port.cpp
In file included from /home/Timur/Projects/MyProject/my-software/source/utilities/hal/efm32-serial-port.cpp:24:
In file included from /home/Timur/Projects/MyProject/my-software/source/utilities/hal/efm32-serial-port.h:27:
In file included from /home/Timur/Projects/MyProject/my-software/source/utilities/hal/abstract-serial-port.h:32:
/home/Timur/Projects/MyProject/my-software/source/utilities/hal/../core/callback.h:32:10: fatal error: 'cstddef' file not found
#include <cstddef>
         ^~~~~~~~~
1 error generated.
scan-build: Using '/usr/bin/clang-4.0' for static analysis
scan-build: 0 bugs found.
scan-build: The analyzer encountered problems on some source files.
scan-build: Preprocessed versions of these sources were deposited in '/tmp/scan-build-2017-07-27-194505-8969-1/failures'.
scan-build: Please consider submitting a bug report using these files:
scan-build:   http://clang-analyzer.llvm.org/filing_bugs.html

【问题讨论】:

  • 嗨,Venemo,你成功了吗?使用 Segger Embedded Studio 和 nRF52 DK 板时,我遇到了同样的问题。
  • @alcor 不,我还在等待这个问题的答案。
  • 谢谢哥们,这里也还在尝试

标签: c++ arm clang cortex-m clang-static-analyzer


【解决方案1】:

看来您也需要指定 use-cc=/usr/bin/arm-none-eabi-gcc 标志:http://blog.canyonbliss.net/static-code-analysis-with-scan-build-while-cross-compiling/

【讨论】:

  • 谢谢!不幸的是,它不起作用,它仍然给我同样的错误。
  • 为我工作。使用 clang 9.0.1 和 arm-none-eabi-gcc 9.2.0
【解决方案2】:

缺少“cstring”是因为 clang 不包含 STL 标头。我遇到了同样的问题,添加 -I&lt;path_to_st_includes&gt; 解决了它。

所以在我的 QBS 中,我有类似的东西:

property string repoDir: "C:/Program Files (x86)/Atmel/Studio/7.0/packs"
cpp.includePaths: [
        repoDir + "/arm/CMSIS/4.2.0/CMSIS/Include",
        "C:/Program Files (x86)/Atmel/Studio/7.0/toolchain/arm/arm-gnu-toolchain/arm-none-eabi/include/c++/6.3.1",
        "C:/Program Files (x86)/Atmel/Studio/7.0/toolchain/arm/arm-gnu-toolchain/arm-none-eabi/include"
        ]

对于vfpcc,这似乎是来自clang的问题。 Chromium 项目甚至修复了删除 vfpcc: https://codereview.chromium.org/411803002/

的使用

目前我发现的唯一解决方案是禁用硬件 FPU 进行静态分析。

一种方法是在 clang 上使用 -mfpu=none。但是接下来gcc会抱怨none无效……而且由于Qt Creator在分析之前构建了项目,所以构建会失败,分析也不会开始。

另一种方法是定义__SOFTFP__。这将强制__FPU_USED 成为0 并禁用所有使用vfpcc 的功能。

【讨论】:

  • 而不是-mfpu=none -mfloat-abi=soft 怎么样?但是我不是这个的忠实粉丝,因为静态分析将在与实际在 MCU 上运行的代码库稍有不同的变体上执行。
  • -mfloat-abi=soft 不起作用。我仍然有关于vfpcc 的错误,但我也有关于缺少包括bits/c++config.h 的新错误。无论如何,我同意这不是最好的解决方案,但它似乎是唯一的解决方案,直到 clang 支持 vfpccvfpcc 从 CMSIS 中删除:-/
  • 关于像您建议的那样添加 STL 标头:是否可以不使用绝对路径,而是以某种方式从编译器查询默认路径?我不想硬连线它。
  • 我不知道。对我来说,这是 Qt Creator 和/或 QBS 缺少的功能。 IDE 应确保将 gcc 使用的包含路径传递给 clang。
猜你喜欢
  • 1970-01-01
  • 2016-12-05
  • 2016-11-17
  • 1970-01-01
  • 2014-06-20
  • 2018-05-17
  • 1970-01-01
  • 2010-12-24
  • 2015-12-03
相关资源
最近更新 更多