Статья посвящена первому знакомству со статическим анализатором Си++-кода PC-Lint версии 8.0. Описан процесс установки инструмента и его первоначальной настройки.
Язык Си++ является одним из самых мощных, но, в то же время, и одним из самых сложных языков программирования. Написано бесчисленное количество литературы по созданию качественного кода, использованию различных методологий разработки и тестирования. Однако проблема повышения качества создаваемого кода до сих пор остается актуальной и не до конца проработанной областью.
Среди инструментов, помогающих в тестировании и улучшении программного кода, можно выделить несколько классов.
К первому классу можно отнести системы, автоматизирующие юнит-тестирование. В качестве примера можно привести такие известные программные продукты, как AutomatedQA TestComplete (http://www.automatedqa.com) или Parasoft Jtest (http://www.parasoft.com). Данная методология тестирования с большим успехом применяется во многих компаниях и незаменима в случае работы над динамично развивающимся программным продуктом.
Другое направление - сокращение издержек на этапе тестирования ПО, за счёт выявления областей ПО затронутых изменениями. Это позволяет значительно сократить объёмы ручного тестирования и выделить модифицированные участки для более тщательной проверки. Такой подход поддерживает высокое качество тестирования при меньших временных затратах. Представителем такого класса инструментов является Testing Relief.
При отладке больших приложений хорошо зарекомендовали себя динамические анализаторы. К ним можно отнести Valgrind (http://valgrind.org), Compuware BoundsChecker (http://www.compuware.com/).
Широкий спектр задач по повышению качества программного кода решают статические анализаторы, как общего назначения, так и специализированного. К первым можно отнести, например, продукцию компании Coverity Incorporated (http://www.coverity.com) или Gimpel Software PC-Lint (http://www.gimpel.com), который мы рассмотрим подробнее. К специализированным статическим анализаторам можно отнести инструмент Viva64 (http://www.viva64.com), предназначенный для диагностики ошибок в 64-битном коде.
В этой статье рассмотрены первые шаги по осваиванию статического анализатора Gimpel Software PC-Lint версии 8.0. Это связано с его популярностью и заинтересованностью разработчиков программного обеспечения в использовании подобных статических анализаторов. Использование статических анализаторов кода давно стало культурой в крупных компаниях и интерес к подобным инструментам непрерывно растет.
При первом знакомстве с PC-lint у начинающего пользователя могут возникнуть трудности с пониманием принципов работы и настройки этой программы. Выполнив предлагаемые в данной статье рекомендации, Вы быстрее сможете приступить к непосредственно анализу кода и не тратить время на изучение нюансов настройки на первых этапах работы.
Данная статья по установке и настройки PC-lint будет представлять собой наглядное руководство, состоящее из рисунков, демонстрирующих последовательные шаги и пояснительного текста к ним.
Рисунок 1. Запускаем инсталлятор.
Рисунок 2. Листаем первые страницы мастера установки.
Рисунок 3. Соглашаемся с лицензионным соглашением.
Рисунок 4. Вводим свое имя и название организации.
Рисунок 5. Выбираем папку для установки. Поскольку вам придется часто работать с папкой, где установлен PC-lint, чтобы поправить конфигурационный файл или почитать документацию, не рекомендуем устанавливать его в папку с большим уровнем вложенности. С другой стороны, после установки Вы можете настроить ссылки на интересующие вас файлы, и тогда место установки не имеет значение. Мы соглашаемся на установку в корневой каталог диска C.
Рисунок 6. Продолжаем процесс установки.
Рисунок 7. Когда установка будет завершена, соглашаемся на запуск конфигурационной программы.
Рисунок 8. Теперь время заварить кофе и приготовиться к настройкам вашего нового инструментария.
Рисунок 9. PC-lint допускает автономное использование в пакетном режиме. Но, на наш взгляд, более удобным представляется его интерактивное использования из среды Visual Studio. Описание процесса интеграции PC-lint в среду можно почерпнуть из файла env-vc7.lnt. Этот файл содержит информацию об интеграции в Visual Studio 2003, но разница по сравнению с интеграцией в Visual Studio 2005 совсем незначительна. Вы можете не обращаться к этому файлу, а воспользоваться для настройки нашим документом, в который уже внесены необходимые поправки касательно Visual Studio 2005.
Рисунок 10. Выбираем расположение конфигурационного файла, который сейчас создаст мастер настройки. Мы рекомендуем расположить его там же, где установлен PC-lint, чтобы все файлы, которые относятся к этой утилите, находились в одном месте. В противном случае Вам придется чуть больше повозиться с настройкой путей к разным файлам. Вы также можете использовать уже существующий файл конфигурации. Выберем создание нового файла конфигурации.
Рисунок 11. Выбираем наиболее подходящий конфигурационный файл для нашего компилятора. К сожалению, мы не найдем в списке Visual C++ 2005, поэтому остановим свой выбор на Visual C++ 2003. В дальнейшем мы вручную скорректируем сгенерированный мастером настроек конфигурационный файл "STD.LNT".
Рисунок 12. Выбираем интересующую нас модель данных.
Рисунок 13. Скорее всего, Вам понадобится поддержка библиотек MFC, STL и Win32API, так что подключаем соответствующие конфигурационные файлы. Эта настройка выполняет очень важное действие: копирует необходимые для работы LNT файлы из каталога "C:\Lint\lnt" в каталог "C:\Lint". Иначе Вам будет необходимо выполнить это копирование вручную. В каталоге "C:\Lint\lnt" эти файлы не обнаруживаются, даже если путь к ним прописать в переменной окружения PATH.
Рисунок 14. Что выбрать из списка различных наборов правил по проверке кода, решать Вам. Можете пока ничего не выбирать, а потом вручную (или этим же мастером настроек) добавлять или убирать различные наборы, анализируя затем результат проверки на ваших программах.
Рисунок 15. Если вы используете в своей программе не только стандартные заголовочные файлы, но и сторонние библиотеки (например, Mesa), то вам понадобится прописать соответствующие пути.
Рисунок 16. Прописываем пути к необходимым заголовочным файлам. Настойчиво рекомендуется это сделать, в противном случае PC-lint будет просто останавливаться на строках #include "unknown.h".
Рисунок 17. Все, создание заготовки конфигурационного файла завершено!
Рисунок 18. Теперь мы можем, используя его как образец, сделать нужные нам конфигурационные файлы. Других конфигураций создавать не будем, поэтому выберем "No".
Рисунок 19. Мы можем также провести некоторые дополнительные настройки по поведению PC-lint. Сейчас мы пройдем этот этап, чтобы в дальнейшем продемонстрировать связь этих настроек с содержимым конфигурационного файла "options.lnt".
Рисунок 20. Не будем подробно останавливаться на следующих настройках. Вам самим придется выбрать, что считать подозрительным кодом, а что нет. Но отметим, что мы выбрали не считать подозрительной следующую конструкцию:
if ( (a = b) ) {
...
}
Рисунок 21. Выбираем наиболее подходящие настройки для нашей среды. Выбор "env-vc7.lnt" никак не отражается на генерируемых конфигурационных файлах. Смысл этой настройки непонятен. Возможно, существует ошибка в мастере конфигурации. Позже мы добавим "env-vc7.lnt" в конфигурацию самостоятельно.
Рисунок 22. Поскольку мы не собираемся использовать PC-lint в пакетном режиме, мы можем пропустить данный шаг конфигурирования.
Рисунок 23. Установка утилиты завершена полностью! Теперь можно приступить к окончательной настройке и интеграции в Visual Studio 2005.
В начале, нам надо отправиться на сайт http://www.gimpel.com и скачать новые обновления для PC-lint и новые конфигурационные файлы. Так как мы используем версию 8.00, то скачиваем для нее обновления со страницы http://www.gimpel.com/html/ptch80.htm.
Если у вас отсутствует файл "co-msc80.lnt", то скачайте его. Он представляет собой конфигурационный файл для работы в Visual Studio 2005. В любом случае он должен находиться в папке "C:\Lint" (см. также рисунок 10).
Также посмотрите другие обновления и действуйте по своему усмотрению.
Теперь мы готовы приступить к доработке конфигурационных файлов. Вначале посмотрим на те файлы, что были сгенерированы при установке утилиты PClint. Это файлы "options.lnt" и "std.lnt". Начнем с файла "options.lnt". У нас он выглядит следующим образом:
// Please note -- this is a representative set of error suppression
// options. Please adjust to suit your own policies
// See manual (chapter LIVING WITH LINT)
// for further details.
-e820 // allow test of parenthesized assignment
В этом файле мастер настройки сохранил ваши пожелания по анализу некоторых конструкций (см. рисунок 15). Помните, мы решили считать конструкцию вида:
if ( (a = b) ) {
...
}
верной? Результат этого решения отразился в файле "options.lnt", как строчка
-e820 // allow test of parenthesized assignment
которая указывает считать указанные конструкции безопасными.
Файл "options.lnt" включается в "std.lnt". Идеология включения одного конфигурационного файла PC-lint в другой, такая же, как и идеология использования директивы "#include" в языках С/С++.
Теперь посмотрим на файл "std.lnt":
// Microsoft Visual C++ .NET 2003,
// -si4 -sl4 -sp8, lib-mfc.lnt lib-stl.lnt lib-w32.lnt
// Standard lint options
co-msc71.lnt
lib-mfc.lnt lib-stl.lnt lib-w32.lnt
options.lnt -si4 -sl4 -sp8
-iD:\ASRC\fox-lib\fox-1.4.4\include
-iD:\ASRC\Libraries\mesa\include
Строчка "co-msc71.lnt" включает (аналогия #include в С/С++) в наш основной конфигурационный файл настройки для компилятора Visual C++ 2003. Сразу измените эту строчку на "co-msc80.lnt".
Строку "lib-mfc.lnt lib-stl.lnt lib-w32.lnt" можно оставить без изменений.
Добавляем "env-vc7.lnt". У нас нет файла "env-vc8.lnt", но и с "env-vc7.lnt" все будет замечательно работать. В документации к PC-Lint предлагается не включать "env-vc7.lnt" в ваши файлы конфигурации, а использовать это как один из параметров при вызове из среды MSVC. Но на наш взгляд проще, чтобы все настройки находились в одном месте. Все равно "std.lnt" уже заточен на работу со средой Visual Studio. И когда, например, появится "env-vc8.lnt", проще поправить в одном месте (в "std.lnt"), чем править несколько команд в среде Visual Studio, вызывающих PC-lint.
Строчка "options.lnt -si4 -sl4 -sp8" кажется сложной, но на самом деле в ней находятся четыре простых и независимых ключа настройки. Первый включает в "std.lnt" файл "options.lnt". А остальные служат для задания размерности типов. За подробностями следует обратиться к документации, входящей в комплект PC-lint.
Идея использования включаемых файлов очень удобна. Так можно собрать отдельно настройки путей к заголовочным файлам или включение/выключение ряда предупреждений. А потом собирать конечные конфигурационные файлы из них, как из кирпичиков. Мы думаем, вы легко с этим разберетесь, а пока, для простоты, избавимся от файла "options.lnt", перенеся его содержимое в "std.lnt".
Добавим в конфигурации еще и уровень предупреждений, задающийся ключиком -w##.
После внесенных исправлений файл "std.lnt" выглядит следующим образом:
-iD:\ASRC\fox-lib\fox-1.4.4\include
-iD:\ASRC\Libraries\mesa\include
co-msc80.lnt
env-vc7.lnt
lib-mfc.lnt
lib-stl.lnt
lib-w32.lnt
-si4 -sl4 -sp8
-w3
-e820
Это вполне рабочий вариант конфигурации, и пришло время интегрировать PC-lint в среду MSVC.
Рисунок 24. Запустим Visual Studio 2005. И приступим к интеграции PC-lint. Мы создадим три новых пункта в меню Tools:
Project Creation - создание проекта PC-lint для проверки всех фалов в проекте MSVC.
Project Check - проверка по ранее созданному проекту (проверка всех файлов);
Unit Check - проверка текущего файла.
В документации к PC-lint также описано использование операции под названием "Simple Check" для проверки отдельной единицы компиляции. Но на практике очень редко можно встретить независимые модули.
Рисунок 25. Выберите пункт "External Tools ..." в меню Tools.
Рисунок 26. Нажмите кнопку "Add".
Рисунок 27. Заполним соответствующие поля, как показано на рисунке.
Рисунок 28. Нажмем кнопку OK. И теперь мы сможем увидеть пункт "PC-lint (Project Creation)" в меню "Tools".
Рисунок 29. Теперь по аналогии с созданием пункта "Project Creation" мы создадим "Project Check". Для этого повторим все предыдущие шаги, но заполним поля по-другому (обратите внимание на галочки).
Рисунок 30. Последней командой является "Unit Check". Для ее создания выполняются все те же шаги.
Рисунок 31. Если Вы все сделали правильно, то во вкладке меню "Tools" Вы можете наблюдать три новых пункта. На этом интеграция PC-lint в Visual Studio закончена.
Если Вы хотите проверить весь ваш проект, следует вначале воспользоваться пунктом PC-lint (Project Creation), а затем PC-lint (Project Check).
Вновь использовать PC-lint (Project Creation) Вы должны, когда добавляете или удаляете файлы из проекта или модифицируете настройки проекта.
PC-lint (Unit Check) служит для проверки кода в текущем активном окне. Это удобно при написании нового кода. Учтите, чтобы воспользоваться PC-lint (Unit Check) вы также вначале должны выполнить PC-lint (Project Creation).
Рисунок 32. Теперь наградите себя за проделанную работу еще одной чашечкой кофе, и мы попробуем с вами эту новую утилиту.
Рисунок 33. Создадим простое Win32 консольное приложение.
Рисунок 34. Нам нужно самое простое приложение, поэтому нажимаем кнопку "Finish".
Напишем следующую программу. Убедимся, что программа компилируется, и компилятор не выдает предупреждений даже на четвертом уровне (/W4).
#include "stdafx.h"
TCHAR FooTxt[] = _T("foo");
bool Foo(int argc, _TCHAR* argv[])
{
for (int i = 0; i != argc; ++i) {
if (_tcscmp(argv[i], FooTxt) == 0)
{
return true;
}
}
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
if (Foo(argc, argv))
return 1;
return 0;
}
Теперь пришло время воспользоваться PC-lint. Выполняем вначле "PC-lint (Project Creation)", а затем "PC-lint (Project Check)". Если все верно настроено, то Вы должны получить приблизительно следующий вывод:
PC-lint for C/C++ (NT) Vers. 8.00u, Copyright Gimpel Software 1985-2006
--- Module: .\SimpleProjectForPClint.cpp (C++)
}
.\SimpleProjectForPClint.cpp(14): error 818: (Info -- Pointer parameter 'argv' (line 5) could be declared as pointing to const)
.\SimpleProjectForPClint.cpp(5): error 830: (Info -- Location cited in prior message)
--- Module: .\stdafx.cpp (C++)
--- Wrap-up for Module: .\stdafx.cpp
.\stdafx.cpp(9): error 766: (Info -- Header file 'D:\WORK3\SimpleProjectForPClint\SimpleProjectForPClint\stdafx.h' not used in module '.\stdafx.cpp')
--- Global Wrap-up
.\SimpleProjectForPClint.cpp(5): error 765: (Info -- external 'Foo(int, unsigned short **)' (line 5, file .\SimpleProjectForPClint.cpp) could be made static)
.\SimpleProjectForPClint.cpp(3): error 765: (Info -- external 'FooTxt' (line 3, file .\SimpleProjectForPClint.cpp) could be made static)
D:\WORK3\SimpleProjectForPClint\SimpleProjectForPClint\stdafx.h(9): error 755: (Info -- global macro 'WIN32_LEAN_AND_MEAN' (line 9, file D:\WORK3\SimpleProjectForPClint\SimpleProjectForPClint\stdafx.h) not referenced)
error 900: (Note -- Successful completion, 6 messages produced)
Сложно с этим не согласиться. Теперь в Ваших руках замечательный инструмент, который позволит улучшить Ваш код и найти как потенциальные, так и настоящие ошибки.
Но если Вы получили сообщение:
PC-lint for C/C++ (NT) Vers. 8.00u, Copyright Gimpel Software 1985-2006
--- Module: .\pclint.cpp (C++)
_
#include <stdio.h>
D:\Sources\pclint\stdafx.h(10) : Error 322: Unable to open include file
'stdio.h'
то это означает, что у Вас не настроены переменные окружения, и Вам необходимо проверить переменную окружения INCLUDE, для чего в командной строке напишем
echo %INCLUDE%
В результате Вы должны увидеть:
C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\include;7
Если пути к заголовочным файлам Visual Studio отсутствуют, то необходимо либо поправить переменные окружения, либо прописать пути к файлам в конфигурационных файлах PC-lint.
Рисунок 35. Нажимая кнопку F4 в окне Output, Вы можете легко осуществлять навигацию по предупреждениям PC-lint.
На этом установку PC-lint 8.00 и интеграцию ее в Visual Studio 2005 можно считать завершенной. Следующим Вашим шагом должно стать ознакомление с документацией и настройка конфигурационных файлов под Ваши специфические потребности. Удачной работы!