я gcc не пользуюсь, но дока на него у меня есть
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Алексей Мусин 18 сентября 2003 г. 09:20
В ответ на: AVR GCC и неиспользуемые функции отправлено Alexander_CH 18 сентября 2003 г. 08:39

2.4. Опции для Включения или Подавления Предупреждений

- 18 -


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

Вы можете включить выдачу многих специфических предупреждений
с помощью опций, начинающихся с '-W', например, '-Wimplicit', чтобы
включить предупреждения на неявных объявлениях. Каждая из таких опций
имеет отрицательную форму, которая начинается с '-Wno-', и служит для
подавления выдачи предупреждений; например, 'Wno-implicit'. В этом
руководстве указана только одна форма каждой опции - та,
которая не является умолчанием.

Следующие опции управляют количеством и видом
предупреждений, выдаваемых GNU CC.

-fsyntax-only
Проверяется код на наличие синтаксических ошибок, но
после этого не делается ничего.

-pedantic
Выдаются все предупреждения, требуемые строгим ANSI стандартом
C, отбрасываются все программы, которые используют запрещенные
расширения.

Правильные ANSI C программы корректно компилируются как с, так
и без этой опции (хотя очень редкие и требуют опции '-ansi'). Однако,
без этой опции поддерживаются также некоторые GNU расширения и
свойства традиционного C. С этой опцией они отклоняются.

'-pedantic' не вызывает предупреждения при использовании
альтернативных ключевых слов, начинающихся и заканчивающихся с '__'.
Предупреждения также не появляются после выражений, переж которыми
стоит '__extension__'. Однако, этот исключительный способ следует
использовать только в системных заголовочных файлах; следует избегать
его в прикладных программах. См. раздел 6.34 [Альтернативные Ключевые
Слова].


- 19 -

Эта опция не претендует на полезность - она существует только
чтобы удовлетворить педантов, которые в противном случае будут
утверждать, что GNU CC не может поддерживать стандарт ANSI C.

Некоторые пользователи пытаются использовать '-pedantic',
чтобы проверить программу на соответствие со строгим стандартом ANSI
C. Они часто обнаруживают, что она делает не ровно то, что они хотят:
она выявляет некоторые не ANSI C конструкции, но не все, а только те,
для которых ANSI C требует диагностику.

Возможность выявить все несоответствия с ANSI C могла бы быть
полезна во многих случаях, но потребовала бы гораздо больше
дополнительной работы совершенно отличной от целей опции '-pedantic'.
Мы скорее рекомендуем пользователю воспользоваться преимуществами
расширений GNU C и игнорировать ограничения других компиляторов. Кроме
некоторых суперкомпьютеров и крайне маленьких машин, есть весьма мало
причин пользоваться каким либо другим компилятором C вместо
раскручиваемого компилятора GNU CC.

-pedantic-errors
Подобна опции '-pedantic', с тем отличием, что вместо
предупреждений порождаются ошибки.

-w
Отменяются все предупреждения.

-Wno-import
Отменяются предупреждения об использовании '#import'.

-Wchar-subscripts
Предупреждает, если индекс массива имеет тип char. Это частая
причина ошибок, так как программисты часто забывают, что этот тип
может быть знаковым на некоторых машинах.

-Wcomment
Предупреждает при каждом появлении начала комментария '/*' в
комментарии.


- 20 -

-Wformat
Проверяет вызовы к printf, scanf и т. д., чтобы проверить
типы передаваемых параметров на соответствие со специфицированной
строкой формата.

-Wimplicit
Предупреждает, когда функция или параметр объявляются неявно.

-Wparentheses
Предупреждает об отсутствии скобок в некоторых контекстах,
таких как присваивание там, где нужно значение или вложенные операции,
в приоритетах которых люди часто путаются.

-Wreturn-type
Предупреждает, если функция объявлена с типом возвращаемого
значения по умолчанию - int. Также предупреждает об операторах
возврата без возвращаемого значения в функциях, чей возвращаемый тип
не есть void.

-Wswitch
Предупреждает, когда оператор switch имеет в качестве
переключателя тип перечисления, и для одного или нескольких
именованных кодов отсутствует case. (Присутствие метки default
подавляет это предупреждение.) Метка case вне диапозона перечисления
также вызывает прежупреждение при использовании этой опции.

-Wtrigraphs
Предупреждает, если встречается какая-либо трехсимвольная ANSI
C последовательность (предполагается, что они включены).

-Wunused
Предупреждает, если переменная не используется вне ее
описания, или если функция объявлена static, но нигде не
определена, или если метка объявлена, но не используется, или если
оператор вычисляет значение, которое точно нигде не используется.

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

- 21 -

переменных и параметров используйте атрибут 'unused' (см. раздел 6.28
[Атрибуты Переменных]).

-Wuninitialized
Автоматическая переменная используется без инициализации.

Это предупреждение возможно только в оптимизирующей
компиляции, поскольку требуемый анализ потока данных выполняется
только при оптимизации. Если вы не используете опцию '-O', вы просто
не получите эти предупреждения.

Эти предупреждения выдаются только для переменных, которые
являются кандидатами на выделение регистров. Следовательно, они не
выдаются для тех переменных, которые объявлены volatile, или тех, чей
адрес берется, или чей размер отличен от 1, 2, 4 или 8 байт. Они,
также, не выдаются для структур, объединений и массивов, даже если они
размещаются на регистрах.

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

Эти предупреждения сделаны необязательными, потому что GNU CC
недостаточно умен, чтобы видеть все случаи, при котрых код может быть
правильным, несмотри на кажущуюся ошибку. Ниже показан один пример,
как такое может случиться:
{

int x;

switch (y)

{

case 1: x = 1;

break;

- 22 -


case 2: x = 4:

break;

case 3: x = 5;

}

foo (x);

}

Если значение y всегда есть 1, 2 или 3, тогда x всегда
иниацализирована, но GNU CC не знает этого. Ниже показан другой общий
случай:
{

int save_y;

if (change_y) save_y = y, y = new_y;

...

if (change_y) y = save_y;

}

Здесь нет ошибки, потому что save_y используется, только если
она была установлена.

Некоторые ложные предупреждения могут быть устранены, если вы
объявите все используемые функции, которые никогда не возвращают
управление, как noreturn. См. раздел 6.22 [Атрибуты Функций].

-Wall
Все вышеперечисленные опции '-W' вместе взятые.


- 23 -

Остающиеся опции '-W...' не включаются в '-Wall', потому что
они предупреждают о конструкциях, которые мы считаем разумным
использовать при случае в хороших программах.

-W
Печатает дополнительные предупреждения при следующих случаях:

* Не volatile автоматическая переменнная может измениться при
longjump'е. Эта опция также возможна только при оптимизирующей
компиляции.

Компилятор смотрит только на вызовы setjump. Он не может
знать, где будет вызвана longjump; в действительности, обработчик
сигнала может вызвать ее в любом месте кода. В результате вы можете
получить предупреждение, даже если на самом деле нет никаких
проблем, потому что longjump вызывается в месте, которое не
порождает проблемы.

* Функция может как возвращать, так и не возвращать значение.
(Попадание в конец тела функции рассматривается как возврат без
значения.) К примеру, следующяя функция вызывает данное
предупреждение:
foo (a)

{

if (a > 0)

return a;

}

* Выражение в левой части операции ',' не содержит побочных
эффектов. Чтобы подавить выдачу этого предупреждения, приведите
неиспользуемое выражение к void. Например, выражение x[i,j]
вызовет данное предупреждение, а выражение x[(void)i,j] - нет.

* Беззнаковое значение сравнивается с нулем с помощью '<' или

- 24 -

'<='.

* Появляется выражение сравнения вида 'x<=y<=z'; оно
эквивалентно '(x<=y ? 1 : 0) <= z', которое отлично от интерпретации
обычной математической нотации.

* Класс памяти вроде static не является первым словом в
объявлении. В соответствии со стандартом C такое использование
является устаревшим.

* Если указана также опция '-Wall' или '-Wunused',
предупреждает о не используемых аргументах.

* Агрегат имеет инициализатор с частью скобок. Например,
следующий код вызывает данное предупреждение из-за отсутствия скобок
вокруг инициализатора x.h:
struct s { int f, g; };
struct t { struct s h; int i; };
struct t x = { 1, 2, 3 };

-Wtraditional

Предупреждает об определенных конструкциях, которые ведут себя
неодинаково в классическом и ANSI C.

* Макроаргумент в строковой константе, появившийся в теле
макроса. Это вызывает подстановку аргумента в классическом C, но в
ANSI C аргумент остается частью строки.

* Функция объявлена внешней в блоке и использована после
конца блока.

* Оператор switch имеет операнд типа long.

-Wshadow
Предупреждает, когда одна локальная переменная затеняет другую
локальную переменную.


- 25 -

-Wid-clash-длина
Предупреждает, когда у двух различных идентификаторов
совпадают первые символы в количестве, определяемым параметром
"длина". Это может вам помочь подготовить программу к компиляции
устаревшим, ненормальным компилятором.

-Wlager-than-длина
Предупреждает, когда объявляется объект размелом больше чем
"длина" байт.

-Wpointer-arith
Предупреждает обо всем, что зависит от размеров типа функции и
типа void. GNU C назначает этим типам размер 1 для удобства
вычислений с указателями на void и на функции.

-Wbad-function-cast
Предупреждает, когда вызов функции приводится к
несоответствующему типу. Например, вызов int malloc () приводится к
указателю.

-Wcast-qual
Предупреждает, когда указатель приводится так, чтобы убрать
квалификатор типа. Например, const char * приводится к обычному char
*.

-Wcast-align
Предупреждает, если указатель приводится так, что возрастают
требования на выравнивание. Например, если char * приводится к int *
на машине, где int может размещаться только по двух- или
четырехбайтовой границе.

-Wwrite-strings
Дает строковым константам тип const char[длина] так, что
копирование адреса в не константный указатель на char вызовет
предупреждение. Эти предупреждения помогут вам найти код времени
компиляции, который может пытаться писать в строковую константу, но
только в том случае, если вы будете внимательно относиться к
использованию const в объявлениях и прототипах. В противном случае это

- 26 -

превратится только в неприятности; вот почему мы не заставляем '-Wall'
вызывать эти предупреждения.

-Wconversion
Предупреждает, если прототип вызывает преобразование типа
отличное от того, которое было бы с тем же аргументом при отсутствии
прототипа. Это включает преобразования целочисленных типов в плавающие
и т. п., и преобразования, меняющие размер или знаковость
целочисленного аргумента, кроме тех, которые совпадают с целочисленным
расширением.

Также предупреждает, если отрицательная целая константа
неявно приводится к беззнаковому типу. Например, предупреждает об
присваивании x = -1, если x беззнаковое. Но не предупреждает об прямо
указаном преобразовании типа (unsigned)-1.

-Wagregate-return
Предупреждает, если определяется или вызывается функция, которая
возвращает структуру. (В языках, где можно возвращать массивы, это
также вызывает предупреждение.)

-Wstrict-prototypes
Предупреждает, если функция объявлена или определена без
спецификации типов аргументов. (Определение функции в старом стиле
не вызывает предупреждения, если перед ним было объявление с
указанными типами аргументов.)

-Wmissing-prototypes
Предупреждает, если глобальная функция определена без
предварительного объявления прототипа. Это предупреждение появляется,
даже если само определение дает прототип. Цель этого предупреждения в
том, чтобы выявить глобальные функции, которые не объявлены в
заголовочных файлах.

-Wredundant-decls
Предупреждает, если нечто объявлено более чем один раз в одной
области действия даже в тех местах, где многократные объявления
допустимы и ничего не меняют.

- 27 -


-Wnested-externs
Предупреждает, если extern объявление встречается дважды внутри
функции.

-Winline
Предупреждает, если функция не может быть сделана inline и при
этом была объявлена inline, или же была дана опция
'-finline-functions'.

-Werror
Превращает все предупреждения в ошибки.


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru