Статический анализатор PVS-Studio 6.22 адаптирован для ARM-компиляторов (реклама)

Компания СиПроВер подготовила новую версию статического анализатора PVS-Studio 6.22, который доработан для обеспечения проверки кода для встраиваемых устройств на базе архитектуры ARM. В частности, в новой версии появилась поддержка ARM Compiler 5 и ARM Compiler 6 в составе сред разработки Keil uVision 5 и Keil DS-MDK, а также поддержка IAR C/C++ Compiler for ARM в составе среды IAR Embedded Workbench.

Для загрузки доступна демонстрационная версия PVS-Studio для Linux. Так как многие проекты для встраиваемых систем являются небольшими и для них не всегда окажется целесообразным приобретать лицензию, разработчики предоставили для подобных проектов вариант бесплатной лицензии. В том числе предоставленный вариант бесплатной лицензии позволяет использовать её не только в открытых, но и в закрытых проектах.

Для тестирования новых возможностей PVS-Studio была проведена проверка кода открытой операционной системы RT-Thread, ориентированной на применения на IoT-устройствах на базе как микроконтроллеров (ARM Cortex-M0, Cortex-M3/4/7), так и процессоров ARM (ARM Cortex-A8 и ARM Cortex-A9 DualCore). Тестирование было проведено в режимах Keil и IAR, и результаты получились примерно одинаковыми.

Из выявленных предупреждений было отобрано 95 наиболее интересных проблем, среди которых:

  • Запись во внешнюю структуру локальных переменных, которые перестанут существовать после выхода из функции, а в структуре останутся указатели уже на другие объекты в стеке;
  • Логическая ошибка при построении условных операторов;
  • Опечатки, в которых вместо двух операторов »&» дважды использовали оператор »&&», что приводит к постоянному возврату значения 0 или 1;
  • Использование вместо оператора »‹‹» значения »‹»;
  • Применение всегда истинного условия «i ‹= 255» для переменной i с типом uint8_t, которое в коде приводит к зацикливанию;
  • Использование условий вида (x!=0 || x!= 1 || x!= 2 || x!= 3), которые всегда являются истинными;
  • Использование при вызове memcpy (elementAddress, filter, sizeof (filter)) не размера всей структуры, а размера указателя на структуру;
  • Разыменование указателя до его проверки;
  • Неосмысленная перезапись переменной («reg_value =» вместо «reg_value |=»);
  • Неполная инициализация массива (обнулялся только элемент с индексом 0, а остальные элементы остались неинициализированными);
  • Тело цикла всегда выполняется только один раз и все условия внутри цикла бессмысленны, так как переменная i всегда равна 0;
  • Переменная нигде не инициализируется перед чтением из неё значения.

0_1519918929.png

© OpenNet