7 сентября 2009 г.

Предупреждения GCC ч.2

Наткнулся тут в тексте статьи на Хабре:
...посмотрим внимательно на вывод компилятора при максимально включенных предупреждениях

$ g++ -W -Wall test.cpp

К самой статье это отношения не имеет, но хочется заметить, что заблуждение насчет максимально включенных предупреждений компилятора встречается довольно часто — -Wall и -Wextra (-W) это еще не все предупреждения. К сожалению, путаница по большей части возникает из-за разработчиков GCC. Начать с того, что имя опции -Wall само по себе вводит в заблуждение, так они еще добавляют или удаляют предупреждения от версии к версии, или вообще меняют их смысл, чем лично меня иногда просто ставят в тупик. Но надо отдать им должное — компилятор все-таки развивается, и сейчас с помощью предупреждений можно узнать гораздо больше, чем в более ранних версиях.

Например, в последней версии GCC (4.4) есть полезные предупреждения, которые нужно включать самостоятельно:
  • -Wcast-qual
    Предупреждает о преобразованиях типа "из const char * в char *".
  • -Wconversion
    Предупреждает, если при преобразовании типов может произойти потеря данных. Например, при преобразовании из long в short.
  • -Wredundant-decls
    Предупреждает об повторном объявлении чего-нибудь в той же области видимости, даже если это ни на что не влияет.
  • -Wshadow
    Предупреждает, если объявление переменной перекрывает объявленную ранее переменную с таким же именем.
  • -Wsign-conversion
    Предупреждает, если результат выражения может изменить знак. Например, при преобразовании из int в unsigned int.
  • -Wunreachable-code
    Предупреждает, если какой-то фрагмент кода никогда не будет выполнен. Например, если перед этим фрагментом стоит return. Этот флаг специально не был включен в группу -Wall для того, чтобы можно было разделять сборки debug и release.

И еще некоторые другие:
  • -Wcast-align
  • -Wformat-nonliteral
  • -Wformat-security
  • -Wformat-y2k
  • -Winit-self
  • -Wlogical-op
  • -Wmissing-format-attribute
  • -Wmissing-include-dirs
  • -Woverlength-strings