Я разрабатываю «голое железо» C / C ++ приложение для микроконтроллера ARM Cortex-M.
Я хотел бы включить статический анализатор Clang в мою систему сборки.
Так что вместо
arm-none-eabi-g++ ....
Я сейчас пользуюсь
scan-build arm-none-eabi-g++ ...
Кажется, это работает нормально, но я получаю кучу сообщений о заголовочных файлах CMSIS и материалах, которые я получил от производителя чипов:
Я согласен, что они должен иметь используемый uintptr_t
вместо int32_t
но не может переписать всю их базу кода, а также заголовки CMSIS. Могу я сказать scan-build
что указатели на этой платформе на самом деле 32-битные, так что нет потери информации?
Я попытался сказать это, чтобы рассмотреть, какую платформу я использую. Но если я использую scan-build --analyzer-target=arm-none-eabi
, Я получил:
Опять же в заголовках CMSIS.
Мои вопросы:
cstring
заголовок, когда я использую --analyzer-target=arm-none-eabi
?Или в качестве альтернативы:
РЕДАКТИРОВАТЬ
Я также попробовал следующее предложение, но оно не сработало, оно привело к тем же ошибкам:
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++ ...
Примечание: я использую ООК построить систему, и сгенерировал scan-build
звонки с использованием cpp.compilerWrapper
собственность в моем .qbs
файл.
Типичная команда выглядит так:
/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__
, Это заставит __FPU_USED
быть 0
и отключить все функции, которые используют vfpcc
,