Hatred's Log Place

DON'T PANIC!

Jun 8, 2012 - 2 minute read - programming c++

На правах заметки: Статический анализ кода C++

Давно пользуюсь услугами cppcheck, но решил поглядеть что есть ещё (как оказалось, лучше, по сути, ничего и нету). Наткнулся на статью по теме на хабре: http://habrahabr.ru/post/75123

Тезисно:

  • Педантичные ключи для gcc (сам автор отсылает за подробностями: http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html), особо хочется отметить неизвестный мне ключ -Weffc++, включает проверку на соответствие рекомендациям Скотта Майерса. Результат сборки моего последнего проекта поверг в уныние: будет ещё работы по вычистке.
  • cppcheck (в арчике есть в стандартных репах)
  • vera++ (есть в AUR)
  • rats (есть в AUR)
  • проверялки для чистого Си (как оказалось(( http://www.cert.org/secure-coding/tools.html и http://www.cs.cmu.edu/~aldrich/courses/654/tools/index.html)) их значительно больше, нежели для C++)

Далее, Анализ утилит статического анализа C++ кода, автор рассматривает следующие анализаторы:

  • rats (выше писал)
  • cppcheck (аналогично)
  • Graudit (есть в AUR)

причём рассматривает проблемы, которые они не выявляют.

Список статических анализаторов можно поглядеть на страничке в википедии: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis, причём не только для C/C++

Для интереса можно почитать перевод статьи Джона Кармака о статическом анализе: http://habrahabr.ru/post/135234/((Оригинал статьи: altdevblogaday.com/2011/12/24/static-code-analysis/)), где кратко излагается, какими инструментами ему довелось воспользоваться, и какие впечатления остались после них.

И на последок серия из четырёх заметок камрада Andrey2008((Один из разработчиков PVS-Studio, поэтому малость пропускаем его отсылы к этому продукту)) “Как уменьшить вероятность ошибки на этапе написания кода”:

  • Заметка №1:
    1. Избегайте функции memset, memcpy, ZeroMemory и им аналогичные
    2. Внимательно следите, работаете вы со знаковым или беззнаковым типом
    3. Избегайте большого количества вычислений в одной строке
    4. Выравнивайте в коде всё, что возможно
    5. Не размножайте строку более, чем один раз
    6. Выставляйте высокий уровень предупреждений у компилятора и используйте статические анализаторы
  • Заметка №2
    1. Не используйте тернарную операцию ‘?:’ в составных выражениях
    2. Не стесняйтесь использовать скобки
  • Заметка №3 - на примерах ошибок в Qt4
    1. Обрабатывайте переменные в той же последовательности, как они объявлены
    2. Табличные методы — это хорошо
    3. Разное интересное (про разные и интересные ошибки в Qt4)
  • Заметка №4 - на примерах ошибок в Firefox