Полезные флаги GCC для C - PullRequest
152 голосов
/ 31 июля 2010

Помимо настройки -Wall и настройки -std=XXX, какие еще действительно полезные, но менее известные флаги компилятора существуют для использования в C?

Меня особенно интересуют любые дополнительные предупреждения и /или и превращение предупреждений в ошибки в некоторых случаях, чтобы свести к минимуму случайные несоответствия типов.

Ответы [ 24 ]

3 голосов
/ 09 августа 2010

Хотя этот ответ может быть немного не по теме и вопрос стоит от меня +1, так как

Меня особенно интересуют любые дополнительные предупреждения и / или превращение предупреждений в ошибки в некоторых случаях в абсолютносвести к минимуму любые случайные несоответствия типов.
есть инструмент, который должен отлавливать ALL ошибок и потенциальных ошибок, которые могут быть неочевидными, есть splint , который, IMHO, работает лучшеотлавливать ошибки по сравнению с gcc или любым другим компилятором.Это достойный инструмент в вашем сундуке с инструментами.

Статическая проверка с помощью инструмента типа lint, такого как splint, должна была быть частью цепочки инструментов компилятора.

2 голосов
/ 31 июля 2010

Меня особенно интересуют любые дополнительные предупреждения,

В дополнение к -Wall, опция -W или -Wextra (-W работает с более старыми версиямиgcc, как и более новые, более поздние версии поддерживают альтернативное имя -Wextra, которое означает то же самое, но более наглядно), включает различные дополнительные предупреждения.

Есть также еще больше предупреждений, которые не включеныодним из них, как правило, для более сомнительных вещей.Набор доступных опций зависит от того, какую версию gcc вы используете. Для получения подробной информации обратитесь к man gcc или info gcc или к интерактивной документации для конкретной интересующей вас версии gcc. И -pedantic выдает все предупреждения, требуемые конкретным используемым стандартом (который зависит от других опций, таких как -std=xxx или -ansi), и жалуется на использование расширений gcc.

и / или поворотпредупреждения об ошибках в некоторых случаях, чтобы свести к минимуму любые случайные несоответствия типов.

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

Вы, вероятно, обнаружите, что вам нужно быть избирательным в отношении того, какие предупреждения включены для каждого проекта (особенно если вы используете-Werror), поскольку заголовочные файлы из внешних библиотек могут отключить некоторые из них.(-pedantic в частности, как мне кажется, в этом отношении бесполезно.)

0 голосов
/ 27 ноября 2018
  • -Werror=return-type: принудительная ошибка, когда функция не возвращает в gcc. Это /we4716 в Visual Studio.

  • -Werror=implicit-function-declaration: Принудительная ошибка при использовании функции без определения / не включена. Это /we4013 в Visual Studio.

  • -Werror=incompatible-pointer-types: ошибка выше, когда тип указателя не соответствует ожидаемому типу указателя. Это /we4133 в Visual Studio.

На самом деле, я хотел бы сохранить свой C-код кроссплатформенным, и я использую CMake, и я помещаю предоставленные флаги в CMakeLists.txt как:

if (CMAKE_SYSTEM_NAME MATCHES "Windows")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /we4013 /we4133 /we4716")
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Darwin")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -Werror=return-type")
endif()
0 голосов
/ 07 февраля 2018
  • -Wmissing-prototypes: Если глобальная функция определена без предыдущего объявления прототипа.
  • -Wformat-security: Предупреждает об использовании функций форматирования, которые представляют возможные проблемы безопасности.В настоящее время это предупреждает о вызовах функций printf и scanf, где строка формата не является строковым литералом и нет аргументов формата
...