Статический анализатор кода

При правильно написанном коде компиляторы могут выводить в консоль предупреждения (англ. warning) о том, что код может содержать ошибку. Простейший пример:

uint32_t a;
// ...
uint32_t b = a + 2;

С точки зрения синтаксиса этот код правилен, но переменная a не проинициализирована, а значит, в ней хранится произвольное значение. Такой код приведет к непредсказуемому поведению.

Компилятор производит простейший анализ кода, но надо понимать, что его главная задача в другом — в генерации исполняемого файла. По этой причине он отлавливает только очевидные слабые места.

Включение и отключение предупреждений производится через ключи компилятора. Включить все предупреждения (GCC) можно, прописав -Wall и -Wextra. Ключ -Werror превратит все предупреждения в ошибки. Подробнее об предупреждениях можно прочитать в документации. // https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Например, от ошибок при копировании-вставке кода компилятор не спасёт.

point.x += dx; 
point.y += dy; 
point.z += dy; // typo, it should be 'dz'

Для более глубокого анализа используют статические анализаторы кода (англ. static code analyzer). Они могут быть как проприетарными, так и с открытым исходным кодом. Например, в состав среды IAR входит анализатор C-STAT, но он недоступен с бесплатной лицензией. К наиболее популярному инструменту можно отнести PC-Lint (платный), а к бесплатным альтернативам — cppcheck.sourceforge.net и splint.org. Список анализаторов можно найти на Википедии.

В критических системах, таких как медицинское оборудование, авиационные системы или атомные станции, использование анализатора кода крайне желательно. Некоторых трагических ошибок, описанных в сносках этой книги, можно было избежать.


Изменено: