Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
Предупреждения компилятора

Предупреждения компилятора

05 Апр 2013

Предупреждения компилятора (Compiler warnings) — это сообщения компилятора о подозрительных местах в программе, которые могут содержать ошибки. В отличие от ошибок компиляции, предупреждения не прерывают процесс сборки программы. Они не являются ошибками с точки зрения языка программирования, но могут быть программными ошибками. Впрочем, многие компиляторы можно настроить так, чтобы предупреждения останавливали процесс компиляции.

Предупреждения не стоит игнорировать. Лучше исправить возможные ошибки ещё до начала тестирования программы. Можно долго и упорно искать ошибку в отладчике, хотя про неё явно сообщает компилятор в одном из предупреждений. Следует стараться, чтобы при работе с проектом все предупреждения были устранены, или их было минимальное количество. Чем меньше предупреждений, тем легче замечать и обрабатывать новые (см. также "Теория разбитых окон").

Различные компиляторы выдают свои предупреждения основываясь на собственном статическом анализе кода, выполняемом на этапе компиляции. Поэтому предупреждения, выдаваемые MSVC и GCC или Clang, могут различаться. К сожалению, компилятор не в силах провести полноценный анализ, поскольку компиляция должна выполняться быстро. Поэтому для поиска более сложных ошибок в программе лучше воспользоваться специализированными инструментами статического анализа кода.

Подавление предупреждений компилятора

Бывают ситуации, когда всё же нужно подавить выдаваемые компилятором предупреждения. Часто это случается при использовании сторонних библиотек и включении расширенного вывода ошибок.

Подавление на уровне кода

Подавление на уровне кода подразумевает внесение изменений в исходный код. Конкретный способ подавления зависит от компилятора, но все они опираются на один и тот же механизм — связку #pragma push и #pragma pop.

MSVC:

#pragma warning(push)
#pragma warning(disable : %WARN%)
//  correct code generating the warning %WARN%
#pragma warning(pop)

Clang:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-W${WARN}"
//  correct code generating the warning ${WARN}
#pragma clang diagnostic pop

GCC:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-W${WARN}"
//  correct code generating the warning ${WARN}
#pragma GCC diagnostic pop

Обратите внимание, что Clang также понимает инструкции подавления от GCC.

Подавление на уровне компилятора/сборочной системы

Часто бывает так, что нет возможности внести изменения в код с предупреждениями. В таком случае можно воспользоваться способами ниже.

Использовать флаги компиляции

Данным способом можно выключить определённые диагностики сразу на всем проекте. Списки с идентификаторами и названиями всех диагностик расположены в конце.

MSVC:

Добавить в опции компиляции флаг /wd%WARN_ID%. Например:

/wd4820

GCC и Clang:

Добавить в опции компиляции флаг -Wno-${WARN_NAME}. Например:

-Wno-unused-comparison

Обратите внимание, что если вам нужно подавить предупреждения только на файлах из определённой директории (библиотеки), то лучше использовать способ ниже.

Пометить директорию как системную

Большинство компиляторов не выдают предупреждения на системном коде. Можно воспользоваться этим свойством, чтобы убрать предупреждения, на которые мы не можем повлиять. Данный способ зависит от используемой системы сборки и компилятора, поэтому покажем только наиболее распространённые варианты.

CMake:

Необходимо использовать инструкцию target_include_directories. Главное — добавить параметр SYSTEM перед необходимым путём. Например, так:

target_include_directories(my_target SYSTEM /path/to/lib)

MSVC:

Можно воспользоваться флагом компиляции /external. Подробнее про него и его применение можно узнать из документации.

GCC and Clang:

При указании путей поиска файлов необходимо использовать флаг -isystem. Например:

-isystem /path/to/lib

Список источников

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам