вторник, 20 декабря 2011 г.

История одного анализатора

В этой статье я хотел бы немного рассказать об истории одного анализатора, а точнее - семейства анализаторов. Зовут это семейство lint. Его основатель, сам lint стал первым статическим анализатором кода в истории.


lint был создан в семидесятых годах в рамках проекта PCC (Portable C Compiler), входившего в состав операционной системы Unix. Анализатор, как и компилятор были написаны Стефаном Джонсоном (Stephen Curtis Johnson), который также является автором генератора синтаксических анализаторов yacc. Это было ещё за долго до принятия ANSI C, тогда даже сам язык выглядел по-другому (K&R C). В 1979 году lint появился как отдельный инструмент в составе ОС UNIX v7. С того времени слово lint стало нарицательным и обозначает не столько саму программу, сколько класс программ, занимающийся статической проверкой кода.

Уже тогда lint умел делать огромное количество проверок: выявлять неиспользованные функции и переменные, проверять информацию об инициализации, проверять соответствие типов, отслеживать неопределённые ситуации и выявлять проблемы с переносимостью программ (тогда ещё с 16 на 32 бита). Также он поддерживал ключевые в комментариях, позволяющие регулировать строгость проверок и вывод результатов.


В 1984 году была создана компания Gimpel Software, которая взяла за основу lint и стала производить коммерческие анализаторы на его основе. Первым релизом стал анализатор PCLint в 1985 году. Характерной особенностью стало то, что он предназначался для платформ OS/2 и Windows. Позже, по просьбам программистов с других платформ, в 1988 году была выпущена кроссплатформенная версия, называющаяся FlexeLint. Она была портирована под Unix, VMS, OS-9 и другие. Развитие анализаторов шло очень быстрыми темпами и в 1993 году, в 6 версии, пользователям была предоставлена поддержка C++. Последний релиз был в 2008 году. Вышла версия 9 с поддержкой анализа многопоточных программ. К сожалению, за хороший продукт требуют хорошие деньги. Так одна лицензия flexeLint стоит 350$.

Вернёмся немного в прошлое и посмотрим на развитие открытого форка lint. В 1994 на симпозиуме SIGSOFT Девид Эванс (David Evans), Джон Гаттаг (John Guttag), Джим Хорнинг (Jim Horning) и Ян Мен Тан (Yang Meng Tan) представили проект lclint. Его идеей стало облегчение работы анализатора засчёт создания .lcl файлов с дополнительной информацией о типах и интерфейсах, использованных в программе. Разница с изначально использовавшимися ключевыми словами в комментариях заключается в том, что комметарии предоставляют неформальное описание кода. По lcl файлу lclint создаёт .lh файл, который включается в заголовок исходника. Формализация интерфейсов должна была помочь анализатору определить корректность самой программы. Т.е. произошло смещение от обычного анализатора в сторону системы верификации.

В 2002 году, начиная с версии 3 проект был переименован в splint, как и называется на текущий момент. Развивается он "группой защищённого программирования"  в университете Вирджинии подразделения компьютерных наук. Лидеры проекта остались те же, что и начинали lclint. Развитие идёт довольно медленно (по сравнению с PCLint). За время существования проекта были добавлены новые аннотации, проверки размеров массивов, отслеживание разыменований нулевых указателей, некоторые эвристические методы.

Рассказывая об этих анализаторах также можно отметить проект Visual Lint, являющийся плагином для Visual Studio и Eclipse. Хотя сам проект не является форком lint и даже анализатором как таковым, он показывает интерес со стороны разработчиков к данному инструменту. На сегодняшний день, Visual Lint поддерживает не только PCLint, но и такие инструменты как cppcheck, findbugs и несоклько коммерческих анализаторов.

История программного обеспечения насчитывает меньше века, а скорость её развития, изменения направлений тенденций поражают воображение. Ежедневно создаются сотни программ, о которых мало кто когда-либо узнает. Но существуют Программы, которые навечно вписывают своё название в историю программирования и становятся точкой отправки для целого семейства инструментов, создаваемых на их основе. lint является одной из таких программ.

Комментариев нет:

Отправить комментарий