2.4 Способы запроса или подавления ошибок и предупреждений
Ошибки — это диагностические сообщения, указывающие на то, что компилятор GNU Fortran не может скомпилировать соответствующий фрагмент исходного кода. Компилятор продолжит обработку программы, пытаясь сообщить о дополнительных ошибках для облегчения отладки, но не создаст никаких скомпилированных результатов.
Предупреждения — это диагностические сообщения, которые сообщают о конструкциях, которые не являются по своей сути ошибочными, но которые представляют собой риск или предполагают, что в программе, вероятно, есть ошибка. Если не указан -Werror, они не препятствуют компиляции программы.
Вы можете запросить многие конкретные предупреждения с помощью опций, начинающихся с -W, например, -Wimplicit для запроса предупреждений по неявным объявлениям. Каждая из этих конкретных опций предупреждений также имеет отрицательную форму, начинающуюся с -Wno-, чтобы отключить предупреждения; например, -Wno-implicit. В этом руководстве перечислен только один из двух вариантов, который не является стандартным.
Эти опции контролируют количество и типы ошибок и предупреждений, генерируемых GNU Fortran:
-
-fmax-errors=n -
Ограничивает максимальное количество сообщений об ошибках до n, после чего GNU Fortran прерывает обработку, вместо попытки продолжить обработку исходного кода. Если n равно 0, ограничений на количество сообщений об ошибках нет.
-
-fsyntax-only -
Проверяет код на синтаксические ошибки, но фактически его не компилирует. Это сгенерирует файлы модулей для каждого модуля, присутствующего в коде, но никаких других выходных файлов.
-
-Wpedantic -pedantic-
Выдает предупреждения об использовании расширений Fortran. -pedantic также относится к конструкциям языка C, где они встречаются в исходных файлах GNU Fortran, например, при использовании ‘\e’ в символьной константе внутри директивы, такой как
#include.Правильные программы Fortran должны компилироваться корректно с этим параметром или без него. Однако без этого параметра поддерживаются определённые расширения GNU и традиционные функции Fortran. С этим параметром многие из них отклоняются.
Некоторые пользователи пытаются использовать -pedantic для проверки программ на соответствие стандарту. Они быстро обнаруживают, что он не делает совсем того, что они ожидают — он находит некоторые нестандартные практики, но не все. Однако улучшения в GNU Fortran в этой области приветствуются.
Этот параметр следует использовать совместно с -std=f95, -std=f2003, -std=f2008, -std=f2018 или -std=f2023.
-
-pedantic-errors -
Подобно -pedantic, за исключением того, что генерируются ошибки, а не предупреждения.
-
-Wall -
Включает часто используемые параметры предупреждений, касающиеся практик, которых мы рекомендуем избегать и которые, по нашему мнению, легко избежать. В настоящее время это включает -Waliasing, -Wampersand, -Wconversion, -Wsurprising, -Wc-binding-type, -Wintrinsics-std, -Wtabs, -Wintrinsic-shadow, -Wline-truncation, -Wtarget-lifetime, -Winteger-division, -Wreal-q-constant, -Wunused и -Wundefined-do-loop.
-
-Waliasing -
Предупреждает о возможном алиасинге аргументов-фиктивных параметров. В частности, он предупреждает, если один и тот же фактический аргумент связан с фиктивным аргументом с
INTENT(IN)и фиктивным аргументом сINTENT(OUT)в вызове с явным интерфейсом.Следующий пример вызовет предупреждение.
interface subroutine bar(a,b) integer, intent(in) :: a integer, intent(out) :: b end subroutine end interface integer :: a call bar(a,a) -
-Wampersand -
Предупреждает об отсутствии амперсанда в продолженных символьных константах. Предупреждение выдаётся с -Wampersand, -pedantic, -std=f95, -std=f2003, -std=f2008, -std=f2018 и -std=f2023. Примечание: если в продолженной символьной константе не указан амперсанд, GNU Fortran предполагает продолжение по первому символу, не являющемуся комментарием или пробелом, после символа амперсанда, который инициировал продолжение.
-
-Warray-temporaries -
Предупреждает о временных массивах, сгенерированных компилятором. Информация, генерируемая этим предупреждением, иногда полезна при оптимизации, чтобы избежать таких временных массивов.
-
-Wc-binding-type -
Предупреждает, если переменная может быть не совместима с C. В частности, предупреждает, если переменная объявлена с использованием внутреннего типа с типом по умолчанию вместо использования параметра типа, определённого для совместимости с C в внутреннем
ISO_C_Bindingмодуле. Этот параметр подразумевается параметром -Wall. -
-Wcharacter-truncation -
Предупреждает, когда присваивание символьной переменной приведет к обрезке присвоенной строки.
-
-Wline-truncation -
Предупреждает, когда строка исходного кода будет обрезана. Этот параметр подразумевается параметром -Wall. Для исходного кода в свободном формате значение по умолчанию — -Werror=line-truncation, так что обрезки будут сообщаться как ошибки.
-
-Wconversion -
Предупреждает об неявных преобразованиях, которые, вероятно, изменят значение выражения после преобразования. Подразумевается параметром -Wall.
-
-Wconversion-extra -
Предупреждает об неявных преобразованиях между различными типами и видами. Этот параметр не подразумевает -Wconversion.
-
-Wextra -
Включает некоторые параметры предупреждений для случаев использования функций языка, которые могут быть проблематичными. В настоящее время это включает -Wcompare-reals, -Wunused-parameter и -Wdo-subscript.
-
-Wfrontend-loop-interchange -
Предупреждает при использовании -ffrontend-loop-interchange для перестановки циклов.
-
-Wimplicit-interface -
Предупреждает, если процедура вызывается без явного интерфейса. Обратите внимание, что проверяется только наличие явного интерфейса. Не проверяется, что объявленные интерфейсы согласованы во всех программных модулях.
-
-Wimplicit-procedure -
Предупреждает, если процедура вызывается, не имея ни явного интерфейса, ни объявленной как
EXTERNAL. -
-Winteger-division -
Предупреждает, если целочисленное деление констант обрезает свой результат. Например, 3/5 вычисляется как 0.
-
-Wintrinsics-std -
Предупреждает, если
gfortranнаходит процедуру, названную как встроенная функция, недоступная в текущем выбранном стандарте (с -std) и обрабатывает её какEXTERNALпроцедуру из-за этого. -fall-intrinsics может использоваться, чтобы никогда не вызывать это поведение и всегда связывать с встроенной функцией независимо от выбранного стандарта. -
-Wno-overwrite-recursive -
Не выдает предупреждение, когда -fno-automatic используется с -frecursive. Рекурсия будет нарушена, если соответствующие локальные переменные не имеют атрибута
AUTOMATICявно объявленного. Этот параметр может использоваться для подавления предупреждения, когда известно, что рекурсия не нарушена. Полезно для сред разработки, использующих -Werror. -
-Wreal-q-constant -
Выдает предупреждение, если вещественная константа содержит букву экспоненты
q. -
-Wsurprising -
Выдает предупреждение при обнаружении подозрительных конструкций кода. Хотя технически законны, они обычно указывают на допущенную ошибку.
В настоящее время это предупреждение выдаётся в следующих случаях:
- Для целочисленной конструкции SELECT с CASE, который никогда не может быть совпаден, так как его нижнее значение больше верхнего.
- Для логической конструкции SELECT с тремя операторами CASE.
- TRANSFER, у которого источник короче назначения.
- Тип результата функции объявлен более одного раза со сходным типом. Если -pedantic или режим совместимости со стандартом включены, это ошибка.
- Переменная
CHARACTERобъявлена с отрицательной длиной. - С -fopenmp, для исходного кода с фиксированной формой, когда встречается маркер расширения поставщика
omx. (Эквивалентный маркерompx, используемый в исходном коде свободного формата, по умолчанию диагностируется.)
-
-Wtabs -
По умолчанию табуляции принимаются как пробелы, но табуляции не являются частью набора символов Fortran. Для строк продолжения поддерживается табуляция, за которой следует цифра от 1 до 9. -Wtabs вызовет предупреждение, если встретится табуляция. Обратите внимание, что -Wtabs активен для -pedantic, -std=f95, -std=f2003, -std=f2008, -std=f2018, -std=f2023 и -Wall.
-
-Wundefined-do-loop -
Предупреждает, если цикл DO с шагом 1 или -1 вызывает подпотоковый или переполнение при итерации индукционной переменной цикла. Этот параметр подразумевается параметром -Wall.
-
-Wunderflow -
Выдает предупреждение при обнаружении числовых константных выражений, которые приводят к ПОДПОТОКУ во время компиляции. Включено по умолчанию.
-
-Wintrinsic-shadow -
Предупреждает, если пользовательская процедура или процедура модуля имеет такое же имя, как встроенная функция; в этом случае может потребоваться явный интерфейс или
EXTERNALилиINTRINSICобъявление, чтобы вызовы позже разрешались на нужную встроенную функцию/процедуру. Этот параметр подразумевается параметром -Wall. -
-Wuse-without-only -
Предупреждает, если оператор
USEне имеет квалификатораONLYи, таким образом, неявно импортирует все публичные сущности используемого модуля. -
-Wunused-dummy-argument -
Предупреждает об неиспользуемых аргументах-фиктивных параметрах. Этот параметр подразумевается параметром -Wall.
-
-Wunused-parameter -
В отличие от
gcc’s значения -Wunused-parameter,gfortran’s реализация этого параметра не предупреждает об неиспользуемых аргументах-фиктивных параметрах (см. -Wunused-dummy-argument), а о неиспользуемыхPARAMETERзначениях. -Wunused-parameter подразумевается параметром -Wextra, если также используется -Wunused или -Wall. -
-Walign-commons -
По умолчанию
gfortranпредупреждает о любом случае, когда переменные дополняются для правильного выравнивания внутри блокаCOMMON. Это предупреждение можно отключить с помощью -Wno-align-commons. См. также -falign-commons. -
-Wfunction-elimination -
Предупреждает, если какие-либо вызовы импольных функций исключаются оптимизациями, включёнными параметром -ffrontend-optimize. Этот параметр подразумевается параметром -Wextra.
-
-Wrealloc-lhs
-
Предупреждать, когда компилятор может вставить код для выделения или перераспределения памяти для переменной массива с выделением памяти (allocatable array) встроенного типа в встроенных присваиваниях. В горячих циклах функция перераспределения Fortran 2003 может снизить производительность. Если массив уже выделен с правильной формой, рассмотрите возможность использования целочисленного массива (например,
(:,:,:)) для переменной в левой части выражения, чтобы предотвратить проверку перераспределения. Обратите внимание, что в некоторых случаях предупреждение отображается, даже если компилятор оптимизирует проверки перераспределения. Например, когда правая часть содержит ту же переменную, умноженную на скаляр. См. также -frealloc-lhs. -
-Wrealloc-lhs-all -
Предупреждать, когда компилятор вставляет код для выделения или перераспределения памяти для переменной с выделением памяти (allocatable variable), включая скаляры и производные типы.
-
-Wcompare-reals -
Предупреждать при сравнении вещественных или комплексных типов на равенство или неравенство. Этот параметр подразумевается параметром -Wextra.
-
-Wtarget-lifetime -
Предупреждать, если указатель в присваивании указателей может быть длиннее, чем его целевой объект. Этот параметр подразумевается параметром -Wall.
-
-Wzerotrip -
Предупреждать, если цикл
DOизвестен как выполняющийся ноль раз во время компиляции. Этот параметр подразумевается параметром -Wall. -
-Wdo-subscript -
Предупреждать, если индекс массива внутри цикла DO может привести к доступу за пределы массива, даже если компилятор не может доказать, что оператор фактически выполняется, в таких случаях, как
real a(3) do i=1,4 if (condition(i)) then a(i) = 1.2 end if end doЭтот параметр подразумевается параметром -Wextra.
-
-Werror Преобразовать все предупреждения в ошибки.
См. Параметры для запроса или подавления ошибок и предупреждений в Руководстве по использованию GNU компилятора GCC для получения информации о дополнительных параметрах, предлагаемых совместно используемым модулем GBE gfortran, gcc и другими GNU компиляторами.
Некоторые из них не имеют эффекта при компиляции программ, написанных на Fortran.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gfortran/Error-and-Warning-Options.html