“Педантичні” ключі GCC

Статичний аналіз

Цікавився питаннями статичного аналізу програмного коду програм на С/С++.

Статичний аналіз програмного коду – аналіз коду програмного забезпечення, що відбувається без реального запуску програм, що досліджуються (інакше, такий аналіз називається динамічним).

Здоровий глузд і здорова логіка підказує “Якщо такі є, то чого б не використовувати доступні засоби не виходячи за межі середовища програмування?!"

Ключі GCC для статичного аналізу

Погуглив і знайшов в GCC набір цікавих ключів:

-Wall -Wextra -pedantic -Weffc++ -Wold-style-cast
-Wconversion -Winit-self -Wunreachable-code
  • -Wall – включає всі попередження, серед яких є сумісність з новим стандартом, коректність меж масиву, та ін. Зазвичай, у більшості програмістів цей параметр увімкнутий по замовчуванню, оскільки дає можливість уникнути непомічених помилок.

  • -Wextra – на додачу до -Wall покриває помилки в стилі порожнє тіло if, порівняння змінних типів signed i unsigned.

  • -pedantic – включає перевірку на відповідність ISO C++ стандарту.

  • -Weffc++ – цікава опція, що містить перевірку рекомендацій від Скота Майерса (Scott Meyers – експерт з мови програмування С++, консультант з розробки програмного забезпечення й автор серії книг “Ефективне використання С++”.:

    • Define a copy constructor and an assignment operator for classes with dynamically allocated memory. Визначайте конструктор копії й оператор присвоєння для тих класів, які використовують динамічне виділення пам’яті.

    • Prefer initialization to assignment in constructors.

      Надавайте перевагу ініціюванню аніж присвоєнню в конструкторах.

    • Make destructors virtual in base classes.

      Робіть деструктори віртуальними в базовому класі.

    • Have operator= return a reference to *this.

      Оператор operator= повинен повертати вказівник на *this.

    • Don’t try to return a reference when you must return an object.

      Не намагайтеся повернути посилання, коли ви повинні повернути об’єкт.

    • Distinguish between prefix and postfix forms of increment and decrement operators.

      Розрізняйте префіксну та постфіксну форму операторів інкременту та декременту.

    • Never overload &&, ||, or ,.

      Ніколи не перевантажуйте оператори &&, ||, чи ,.

  • -Wold-style-cas – реагує на приведення типів у стилі Сі.

  • -Werr='тип попередження' – сприймати вказане попередження як помилку. Якщо передати компілятору

    -Werr без параметрів, це означатиме, що кожне попередження сприйматиметься як помилка.

  • -Wconversion -Wsign-conversion – реагує на перетворення типу, при якому може змінитися значення.

  • -Winit-self – уникнення “само-визначення”, тобто ситуацій типу int i = i;

  • -Wunreachable-code – реагує на код, який ніколи не буде виконаний.

Детальніше про них можна прочитати:

  • Options to Request or Suppress Warnings
  • Options Controlling C++ Dialect

Ключі GCC для статичного аналізу в Qt

Проте, вказавши ці ключі в Qt-проекті, в .pro-файлі:

QMAKE_CXXFLAGS += -Wall -Wextra -pedantic -Wold-style-cast
QMAKE_CXXFLAGS += -Wconversion -Winit-self

Отримую на порожньому проекті порядку 0.5К попереджень! При чому, абсолютна їх більшість стосується не мого коду, а коду Qt.

Щоб цього уникнути варто скористатися GCC-шним ключем -isystem щою помітити каталог з хедерами Qt як системний (порада зі ).

Отже, для адекватного статичного аналізу коду проекту на Qt потрібно додати в .pro-файл наступний код (з вказаними бажаними ключами, наприклад, як у мене):

QMAKE_CXXFLAGS += -isystem "D:\Qt\4.8.4\include"
QMAKE_CXXFLAGS += -Wall -Wextra -pedantic -Wold-style-cast
QMAKE_CXXFLAGS += -Wconversion -Winit-self

Посилання

comments powered by Disqus