Как использовать статический анализатор Clang с проектом Cortex-M?

Я разрабатываю «голое железо» C / C ++ приложение для микроконтроллера ARM Cortex-M.
Я хотел бы включить статический анализатор 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’ не найден
  • ошибка: неизвестное имя регистра vfpcc в asm

Опять же в заголовках CMSIS.

Мои вопросы:

  • Почему анализатор не может найти cstring заголовок, когда я использую --analyzer-target=arm-none-eabi?
  • Как я могу сказать анализатору, что мои указатели действительно 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++ ...

Примечание: я использую ООК построить систему, и сгенерировал 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

2

Решение

Похоже, вам нужно указать use-cc=/usr/bin/arm-none-eabi-gcc флаг тоже: http://blog.canyonbliss.net/static-code-analysis-with-scan-build-while-cross-compiling/

1

Другие решения

Отсутствует 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,

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector