Статьи

Статический анализ кода с открытым исходным кодом: Cppcheck с Eclipse

У меня есть проблема для вас: Можете ли вы найти проблему в следующем источнике?


TMOUT1_CounterHandle TMOUT1_GetCounter(TMOUT1_CounterType nofTicks)
{
  TMOUT1_CounterHandle handle;
  CS1_CriticalVariable();

  handle = 0;
  if (nofTicks==0) {
    nofTicks = 1; /* wait at least for one tick, otherwise will timeout immediately */
  }
  CS1_EnterCritical();
  while (!TMOUT1_FreeCounters[handle] && handle<TMOUT1_NOF_COUNTERS) {
    handle++;
  }
  if (handle<TMOUT1_NOF_COUNTERS) {
    TMOUT1_FreeCounters[handle]=FALSE;
    TMOUT1_Counters[handle] = nofTicks;
  }
  CS1_ExitCritical();
  if (handle==TMOUT1_NOF_COUNTERS) {
    return TMOUT1_OUT_OF_HANDLE;
  }
  return handle;
}

Нет? Ну, я не заметил проблему в первый раз. Однако читатель этого блога сделал: он использовал классный инструмент под названием «cppcheck»: этот инструмент сообщил следующее:

 Название изображения

Указатель массива используется до проверки ограничений

Как это круто? Не очень крутой мой плохой стиль программирования здесь :-(. По крайней мере, исправить это было легко :-).

Cppcheck может найти много ошибок кодирования, проблемы переносимости и многое другое. Cppcheck нашел для меня эту реальную проблему в USB-стеке Freescale:

Название изображения

Пример проблемы, найденной Cpptest

Так что это плохая и неприятная ошибка: функция возвращает адрес переменной в стеке !!! При возврате из этой функции эта переменная в стеке исчезает и может привести к сбою системы. Спасибо, что отметили это, Cppcheck!

Очевидно, что разработчик, пишущий этот код, не использовал cppcheck, и я думаю, что он действительно должен был это делать. Я начал использовать Cppcheck для своей базы кода, и я поражен тем, сколько возможных проблем он может найти!

Итак, вот как вы можете установить и использовать его …

Установка Cppcheck

Cppcheck можно загрузить с http://cppcheck.sourceforge.net/ :

Название изображения

Cppcheck веб-сайт

Сайт SourceForge с загрузкой находится здесь: https://sourceforge.net/projects/cppcheck/ . Запустите установку, и она установит Cppcheck.

Установка Eclipse Plugins

Что делает использование Cppcheck действительно простым, так это плагин Cppcheclipse в Eclipse. Веб-сайт этого плагина находится здесь: https://code.google.com/a/eclipselabs.org/p/cppcheclipse . Следуйте инструкциям на
https://code.google.com/a/eclipselabs.org/p/cppcheclipse/wiki/Installation
или используйте следующий сайт обновлений Eclipse с помощью Справка> Установить новое программное обеспечение : http: //cppcheclipse.eclipselabs. org.codespot.com/svn/update/

В настройках рабочего пространства Eclipse («Окно»> «Установки») укажите двоичный файл Cppcheck:

Название изображения

Бинарный путь к Cppcheck

Эта панель также имеет глобальные настройки для всех проектов, или я могу установить конкретные параметры проекта.

Название изображения

Конфигурация сообщений cppcheck

Использование Cppcheck с Cppcheclipse

Запустить Cppcheck для проекта легко: просто используйте контекстное меню, а не проект:

Название изображения

Запуск CppCheck

Это проверит источники в проекте и сообщит о проблемах в представлении проблем.

подсказки

Если возникает проблема со слишком большим количеством конфигураций:

;;information;toomanyconfigs;Too many #ifdef configurations - cppcheck only checks 12 configurations. Use --force to check all configurations. For more details, use --enable=information.

Название изображения

Cppcheck слишком много конфигураций

Чтобы избежать этой проблемы, я могу ограничить количество конфигураций, и у меня есть __GNUC__, определенный в свойствах проекта:

Название изображения

Ограниченная конфигурация

Я рекомендую прочитать руководство по cppcheck, например, по адресу http://cppcheck.sourceforge.net/manual.html . Он имеет множество расширенных опций и способов подавления предупреждений / сообщений непосредственно в исходном коде и т. Д.

Резюме

Всегда удивительно, какие крутые жемчужины инструментов с открытым исходным кодом доступны для изучения! Cpptest — это мощный бесплатный инструмент для статического анализа, который можно легко использовать с Eclipse, в том числе с Kinetis Design Studio от Freescale. Он может не поймать каждую программную ошибку, и у разработчика должен быть в руках целый набор инструментов. Но каждая ошибка, убитая раньше, на одну ошибку меньше :-). Я тоже использую PC-lint (см. « Eclipse и PC-lint: Linticator »), но иметь бесплатный инструмент с открытым исходным кодом в дополнение к PC-lint еще лучше.