Статический анализатор кода
При правильно написанном коде компиляторы могут выводить в консоль предупреждения (англ. 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. Список анализаторов можно найти на Википедии.
В критических системах, таких как медицинское оборудование, авиационные системы или атомные станции, использование анализатора кода крайне желательно. Некоторых трагических ошибок, описанных в сносках этой книги, можно было избежать.