Я разрабатываю приложение C/C++ «голого металла» для MCU на базе 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++ ...
Примечание. Я использую систему сборки qbs и сгенерировал 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