Статический анализатор 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;
- Переменная нигде не инициализируется перед чтением из неё значения.
© OpenNet