如何将 Clang 静态分析器与 Cortex-M 项目一起使用?
How to use Clang static analyzer with a Cortex-M project?
我正在为基于ARM Cortex-M的MCU开发一个"裸机"C/C++应用程序。 我想将 Clang 静态分析器合并到我的构建系统中。
所以而不是
arm-none-eabi-g++ ....
我现在使用
scan-build arm-none-eabi-g++ ...
这似乎工作正常,但我收到一堆关于CMSIS头文件和我从芯片制造商那里得到的东西的消息:
- 错误:从指针转换为较小的类型"uint32_t"(也称为"无符号 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
看起来您还需要指定use-cc=/usr/bin/arm-none-eabi-gcc
标志: http://blog.canyonbliss.net/static-code-analysis-with-scan-build-while-cross-compiling/
缺少"cstring"是因为 clang 不包含 STL 标头。我遇到了同样的问题,添加-I<path_to_st_includes>
修复了它。
所以在我的 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
来说,这似乎是来自叮当声的问题。Chromium项目甚至有一个修复程序来删除vfpcc
的使用:https://codereview.chromium.org/411803002/
到目前为止,我找到的唯一解决方案是禁用硬件 FPU 进行静态分析。
一种方法是在叮当声中使用-mfpu=none
。但是然后 gcc 会抱怨none
无效......由于Qt Creator在分析之前构建项目,因此构建将失败,分析将不会开始。
另一种方法是定义__SOFTFP__
。这将强制0
__FPU_USED
并禁用所有使用vfpcc
的功能。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 如何将 Clang 静态分析器与 Cortex-M 项目一起使用?