Table of Contents

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

Для меня красота C++ заключается в первую очередь во вседозволенности и ужасающей мощи языка. Мы можем работать с памятью так же плотно, как и в C, и в то же время имеем такие средства, как шаблоны и STL, превосходящие по уровню абстрактности все, что я когда-либо видел. Плата за это соответствующая - не всегда вразумительные ошибки компилятора (попробуйте забыть поставить точку с запятой после определения класса), очень большой срок подготовки и обучения программистов, но самое главное - некоторые баги становятся заметными только во время выполнения программы.

О проблеме

Мы хотим больше полезных ворнингов до выполнения наших программ. Одно из средств получения желаемого - статический анализ кода. Статический - значит, не запуская программу. Интересны не только вероятные ошибки, случаи undefined behaviour, утечки памяти, но и вещи вроде недоступности/неиспользуемости кода, рекомендации по повышению интуитивности стиля программирования. Средства получения метрик ПО, добываемых методами статического анализа в этой статье не рассматриваются. Замечания, связанные со стандартами программирования (фигурная скобочка должны находиться на отдельной строчке, ууууу!!) тоже не интересны. Критерии оценки простые - количество и полезность находимых багов, простота использования (в частности, отсутствие требований модификации кода), бесплатность/разумная цена/хороший кряк. Проводи первичный обзор и выдаем на-гора пачку ссылок:

Найденные штуки

Педантичные ключи gcc

ман-статья про все эти ключи

Item 11: Define a copy constructor and an assignment operator for classes with dynamically allocated memory.

Item 12:  Prefer initialization to assignment in constructors.
Item 14:  Make destructors virtual in base classes.
Item 15:  Have "operator=" return a reference to *this.
Item 23:  Don't try to return a reference when you must return an object.
Item 6:  Distinguish between prefix and postfix forms of increment and decrement operators.
Item 7:  Never overload "&&", "||", or ",".

Cppcheck

Пожалуй, самая достойна из найденных программ. cpp check и его плагин для эклипсоидов. Распознает довольно много, находит следующие ошибки:

Проверялки для C без плюсов

Удивительно, но программисты на чистом Си, похоже, больше заботятся о статическом анализе. Тут мы имеем:

Будут ли они полезны плюсовым разработчикам? Если у вас есть код без классов и вы помните, какие программы на C++ не будут собираться компилятором С, то почему бы и нет?

Splint

Simian

Vera++

Непонятное, офтопное

Триальное/крякнутое ПО

А мало его такого. Много анализаторов, стоящих много долларов и не имеют кряков. Вот пример такого анализатора, можно зайти на их сайт и попросить триальник Cleanscape

Что бы еще хотелось

Хотелось бы: