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

Я разрабатываю приложение 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

person Venemo    schedule 26.05.2017    source источник
comment
Привет, Венемо, у тебя получилось? У меня точно такая же проблема с использованием Segger Embedded Studio и платы nRF52 DK.   -  person alcor    schedule 21.07.2017
comment
@alcor Нет, я все еще жду ответа на этот вопрос.   -  person Venemo    schedule 21.07.2017
comment
спасибо приятель, все еще пытаюсь здесь тоже   -  person alcor    schedule 25.07.2017


Ответы (2)


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

person Jesse    schedule 25.07.2017
comment
Спасибо! К сожалению, это не работает, все равно выдает те же ошибки. - person Venemo; 27.07.2017
comment
работал на меня. С clang 9.0.1 и arm-none-eabi-gcc 9.2.0 - person Jon Nordby; 05.05.2020

Отсутствие «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 похоже проблема от clang. В проекте Chromium даже было исправление для удаления использования vfpcc: https://codereview.chromium.org/411803002/

Единственное решение, которое я нашел до сих пор, — отключить аппаратный FPU для статического анализа.

Один из способов сделать это — использовать -mfpu=none в clang. Но тогда gcc будет жаловаться, что none недействителен... А так как Qt Creator собирает проект до анализа, то сборка завершится ошибкой и анализ не запустится.

Другой способ — определить __SOFTFP__. Это заставит __FPU_USED стать 0 и отключит все функции, использующие vfpcc.

person Benjamin T    schedule 02.11.2017
comment
Вместо -mfpu=none как насчет -mfloat-abi=soft? Однако я не большой поклонник этого, потому что тогда статический анализ будет выполняться на немного другом варианте кодовой базы, чем тот, который фактически выполняется на MCU. - person Venemo; 03.11.2017
comment
-mfloat-abi=soft не работает. У меня все еще есть ошибки, связанные с vfpcc, но у меня также есть новые ошибки, связанные с отсутствующим включением bits/c++config.h. В любом случае, я согласен, что это не лучшее решение, но, похоже, это единственное решение, пока clang не поддерживает vfpcc или vfpcc не будет удален из CMSIS :-/ - person Benjamin T; 03.11.2017
comment
О простом добавлении заголовков STL, как вы предложили: возможно ли не использовать абсолютный путь, а вместо этого как-то запрашивать пути по умолчанию из компилятора? Я бы предпочел не фиксировать его. - person Venemo; 03.11.2017
comment
Я не знаю. Для меня это недостающая функция Qt Creator и/или QBS. Среда IDE должна убедиться, что пути включения, используемые gcc, передаются в clang. - person Benjamin T; 03.11.2017