GCC - The Complete Reference (537669), страница 129
Текст из файла (страница 129)
Речь идет о таких конструкциях, которые могут по-разному обрабатываться различными компиляторами и соответственно давать непредсказуемый результат при портировании кода. Предупреждения выдаются в следующих случаях: ° Выражения с двумя операторами в одной строке и неопределенным порядком их выполнения. Например, кол хь "у*в из-за пропущенных скобок может быть интерпретирован как х**(у*в) и как (х*ау) в. установка флага -бребапе1с также назначает выдачу предупреждений о таких ситуациях.
° Выражения с неоднозначной унарной операцией "-". Например, выражение -2*ах может быть истолковано как (-2*а ) х или как — (2**х) . ° Использование в качестве счетчика цикла рц действительного числа вместо целого, Это может давать неожиданный результат при использовании различных компиляторов. Приложение Г. Опции командной строки компилятора ОСС 579 тому что опция -тяе11 тоже по умолчанию игнорирует системные файлы-заголов- ки. -111(1гадШог)а! Выдает предупреждения для стандартных конструкций языка, которые могут иметь различное значение, или не определены в традиционном стандарте языка С. Для обеспечения переносимости кода следует избегать использования некоторых неоднозначных или проблематичных конструкций.
Вот список некоторых ситуаций, по которым возможна выдача предупреждений: ° Преобразование типов (Сопуегз)оп). Конвертирование между типами чисел с фиксированой и с плавающей точкой, вызванное несоответствием определения функции объявлению ее прототипа. См. также -т(сопуехсаоп. Пример вызова функции, который приведет к выдаче предупреждения: уоза Еа)кеаоеЬ1е (аоиЬ1е сика1) к апе е1диву = ас) СакеаоиЬ1е(е1яЬСу) ! ° Локальные функции (Ех(егпа1). Случаи вызова функций, объявленных с атрибутом ехсехпа1, за пределами области их видимости (блока, в котором они были объявлены). ° Инициализация (1п!(!а! уа!цез), Присвоение начальных значений автоматическим агрегатным типам.
Например, объединению (ипюп) или структуре (з(гпс!), объявленному внутри функции. ° Инициализация (! п((!а! ча!пез). Присвоение начального значения объединению (ипюп) вызовет предупреждение. Даже при использовании для инициализации константы, равной нулю. ° Метка (1.аЬе1). Совпадение имени метки с именем объявленной переменной. ° Константы (Сопя(ап(з).
Случаи объявления целочисленных констант с суффиксом (), а также констант вещественных чисел (геа1 пшпЬетз) с суффиксами у или Х. ° Константы (Сопя(ап(з). Объявления буквенных констант (символьных литералов) в форме десятичного числа при отличии диапазона и~или знака числа (+/Ч от требований традиционного стандарта языка С.
Предупреждения выдаются только для десятичной формы представления. Шестнадцатиричные и восьмеричные константы всегда воспринимаются как последовательность бит. е Буквенные строки (Ейега! з(г!пйз). Предупреждения выдаются при использовании метода объединения строк (солса(епа(юп) стандартного диалекта С. е Препроцесеор (Ргертосеззог). Использование имени макроса (гпасго) в строковых литералах (з(ппя 1йега!). Стандартный язык С не допускает этого, хотя в традиционном языке Кй)к С строки могут содержать имена макросов.
° Препроцеесор (Ргергосеззог). Все директивы препроцессору начинающиеся в первой позиции строки, не определенные в традиционном языке С. 580 часть пг. Приложения ° Препроцессор (Ргергосеззог). Макроопределения в форме функций без назначения аргументов. ° Статические функции (Яа(!с). При объявлении з(а()с-функции после объявления не статических функций. Некоторые компиляторы традиционного стандарта языка С не воспринимают такой код. ° Оператор Ян((е)).
При использовании в операторе аттйсс)) переменной типа 1опд в качестве операнда переключателя саве. ° Присутствие унарной операции "+" (Опагу р!цз). -)йПп9гаРМ С Включает выдачу предупреждений об использовании триграфов ((пягар))з) в строковых константах.
Есть замечательный пример. Одна из версий ядра (.(ппх содержала такую строку: «йвш: ракйсу еккох ( уз в) 1п". Стандартным компилятором языка С она транслировалась в ийвяаг рах1су егкох (в11п". -ФипдеФ С, С++, ОЬ(С Включает выдачу предупреждений при использовании не определенного идентификатора в выражении условия директивы йети. -Фип! пса!вел Выдает предупреждения при использовании автоматической переменной до ее инициализации. Также предупреждает о ситуации, когда вызов яесбшяр() может нарушить значение автоматической переменной. Опция должна использоваться только в сочетании с -о, потому что для определения таких случаев используются результаты оптимизации потока данных (да(а йо)ч апайяз).
Точность этих сообщений не гарантирована. В следующем примере показана трудно определяемая ситуация, когда функции ркйпсй ( ) может быть передано как инициализированное, так и неинициализированное значение переменной ча1пе: 1пс ча1пе) 1Г(а < Ь)г ча1ие = Вг е1ее 1к(а > с) чазпе = 10; ргзпее("Ъйхп",ча1пе)) Из-за особенностей применяемых способов анализа потока данных действие рассматриваемой опции не распространяется на структуры (а(гпс(), объелинения (ипюп), массивы, любые переменные с атрибутом чо1ас11е, переменные адресуемые через ссылки на них, переменные, которые используются для вычисления значений, в дальнейшем нигде в программе не используемых. Результаты анализа потока данных предупреждают об использовании оператора вес з шар ( ), но не определяют места обращений к 1опдб шар ( ) . Поэтому предупреждения могут выдаваться и при отсутствии проблем.
Те же способы оптимизации потока данных используются и для исходного кода на языке Рог(гав. Следующий пример показывает ситуацию, когда точно определить Приложение Г. Опции командной строки компилятора ОСС 53 1 ислользование неинициализированной переменной ТЧАЬ не представляется Возмож- ным.
1Р (1ЧАЬ .В(). 1) ТУАЬ = 5 1Р (1УАЬ .Б(). 2) тЧАЬ = 10 САть Бион(тчль) Появление некоторых выдаваемых лри этой опции ложных сообщений можно предотвратить объявлением функций, не возвращающих значение, с атрибутом погесигп. Опция -нипзп1с1а11яект автоматичеСки Устанавливается лрн совместном использовании опций -т(а11 и -О. -%нп(спО)(чп-ргзятпед Выдает предупреждения об использовании неизвестных лиректив йрга(ива. Если олция лрименена не автоматически вследствие установки -тяа11, а указана явно, то ее действие раслространяется и на системные заголовочные файлы (зуз(ел) )(еа()ег Нез).
-Фнпгеасг)аЫе-соде Включает выдачу лредулреждений о неиспользуемых лри выполнении программы участках кода. Следует с большой осторожностью удалять участки, по которым выдаются такие сообщения. Предупреждения могут выдаваться о подстанавливаемом (ш)ше) коде функции или расширении имени макроса (ехрапбоп оГа гласго) лри том, что другие экземпляры вхождений такого кода могут использоваться программой, Кроме того предупредительные сообщения могут выдаваться при намеренном пропуске участков условного кода установкой опций компилятора. -Фнпыед Эта опция устанавливает набор опций -тлтоцвеб-йцлссхоп, -ншшве(1-1аье1, -ицтшветт-рагатвесег, -ишлвек)-уа1ие и -«лишае(т-чаг1аЬ1е. При комлнляции программ на языке Рог(щи лри этой олции выдаются предупреждения ло всем объявленным, но не использованным переменным.
Опция автоматически применяется при установке -тта11. -Фнпнзед-1нпсс)оп Выдает предупреждения о неиспользуемых определениях статических (з(айс) функций, а также при отсутствии определений объявленных функций. Опция -тяипиве(т-йппсс1оп задействуется автоматически лри использовании опции -мцьшвей или -(яа11. -Фнпыед-(а)зе! Включает выдачу предупреждений о неиспользуемых метках, объявленных в программе без атрибута аловерт. Олция -т(словак)-йипсс1оп задействуется автоматически при использовании опции -ншшвеб или -На11. 582 частыЧ. приложения -1йгцпыед-рагагпе1ег Вылает предупреждения о неиспользуемых аргументах функций, объявленных без атрибута пппвеб.