Используйте преимущества анализаторов кода
(В оригинале - Take Advantage of Code Analysis Tools)
Важность тестирования усиленно вбивается в головы программистам с самого начала их карьеры. В последние годы набирающие популярность технологии юнит-тестирования, test-driven и agile разработки показывают на рост интереса внедрить тестирование во все фазы цикла разработки. Однако, тестирование – лишь один из инструментов для повышения качества вашего кода.
Давным-давно, когда С был новинкой, процессорное время и место на диске представляли существенную ценность. Поэтому компиляторы того времени снижали количество проходов до минимума, жертвуя при этом некоторой частью семантического анализа. Это означало, что компилятор проверял только часть ошибок, которые могли быть обнаружены во время компиляции. И для компенсации этого Стивен Джонсон (Stephen Johnson) написал lint – программу, выполняющую статический анализ кода, «выброшенный» из компиляторов. Однако, статистические анализаторы кода заслужили славу большого количества ложно-положительных предупреждений и стилистических конвенций, необязательных для безусловного следования.
Сейчас ситуация с языками, компиляторами и статическими анализаторами сильно отличается от того, что было ранее. Практически каждый язык может похвастаться хотя бы одной программой проверки на соответствие стилю и поиска коварных сложнообнаруживаемых ошибок вроде возможной разадресации нулевого указателя. Более продвинутые программы, вроде Splint для С или Pylint для Pyton, имеют возможности настройки того, какие ошибки и предупреждения программа будет игнорировать, как через конфигурационный файл, так и через опции командной строки. Splint даже позволяет использовать специальные комментарии, поясняющие ему, как работает ваша программа.
Если же вы «застряли» в поиске ошибки, которую не обнаруживает ни компилятор, ни IDE, ни какой-либо известный статический анализатор, то вы всегда можете сделать свой собственный анализатор. Это не так сложно, как может казаться. Большинство языков публикуют свое абстрактное синтаксическое дерево и компилятор как часть стандартной библиотеки. Знание потаенных уголков стандартной библиотеки очень помогает, поскольку там часто можно найти спрятанные жемчужины, могущие сильно помочь статическому анализу и динамическому тестированию. Например, в стандартной библиотеке Python есть дизассемблер, который может выдать вам байт-код, используемый для генерации скомпилированного кода. С первого взгляда выглядит как что-то непонятное и пригодное только для авторов компилятора Python, однако на практике оказывается весьма полезным инструментом. Эта библиотека может дизассемблировать стек вызовов, точно указав, какая инструкция байт-кода вызвала последнее необработанное исключение.
Так что не позволяйте тестированию быть единственным инструментом повышения качества вашего ПО – используйте возможности программ-анализаторов, а при необходимости не бойтесь написать свой собственный анализатор кода.
Автор оригинала - Sarah Mount