Spec-Zone.ru › GCC 13

3.7 Параметры форматирования диагностических сообщений

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

-fmessage-length=n

Попробуйте отформатировать сообщения об ошибках так, чтобы они помещались на строках примерно из n символов. Если n равно нулю, перенос строк не выполняется; каждое сообщение об ошибке отображается на одной строке. Это значение по умолчанию для всех front end.

Примечание: этот параметр также влияет на отображение директив препроцессора ‘#error’ и ‘#warning’, а также атрибута функции/типа/переменной ‘deprecated’. Однако он не влияет на пragma ‘pragma GCC warning’ и ‘pragma GCC error’.

-fdiagnostics-plain-output

Этот параметр запрашивает, чтобы вывод диагностики был максимально простым, что может быть полезно при запуске dejagnu или других утилит, которым требуется анализировать диагностический вывод и которые предпочитают, чтобы он оставался более стабильным со временем. -fdiagnostics-plain-output в настоящее время эквивалентен следующим параметрам:

-fno-diagnostics-show-caret
-fno-diagnostics-show-line-numbers
-fdiagnostics-color=never
-fdiagnostics-urls=never
-fdiagnostics-path-format=separate-events

В будущем, если GCC изменит стандартный вид своей диагностики, соответствующий параметр для отключения нового поведения будет добавлен в этот список.

-fdiagnostics-show-location=once

Значимо только в режиме переноса строк. Указывает отчётчику сообщений о диагностике выводить информацию о расположении источника один раз; то есть, в случае, если сообщение слишком длинное, чтобы поместиться на одной физической строке, и его нужно разбить на несколько строк, информация о расположении источника не будет выводиться (в качестве префикса) снова и снова на последующих продолжениях строк. Это поведение по умолчанию.

-fdiagnostics-show-location=every-line

Значимо только в режиме переноса строк. Указывает отчётчику сообщений о диагностике выводить одну и ту же информацию о расположении источника (в качестве префикса) для физических строк, полученных в результате разбиения сообщения, которое слишком длинное, чтобы уместиться на одной строке.

-fdiagnostics-color[=WHEN]
-fno-diagnostics-color

Использовать цвет в диагностике. WHEN может принимать значения ‘never’, ‘always’ или ‘auto’. Значение по умолчанию зависит от того, как был сконфигурирован компилятор, оно может быть любым из вышеперечисленных вариантов WHEN, а также ‘never’, если переменная среды GCC_COLORS не присутствует в окружении, и ‘auto’ в противном случае. ‘auto’ заставляет GCC использовать цвет только тогда, когда стандартный вывод – терминал, и когда выполнение не происходит в оболочке emacs. Формы -fdiagnostics-color и -fno-diagnostics-color являются псевдонимами для -fdiagnostics-color=always и -fdiagnostics-color=never соответственно.

Цвета определяются переменной среды GCC_COLORS. Ее значение – это список значений, разделенных двоеточием, содержащих возможности и подстроки Select Graphic Rendition (SGR). Команды SGR интерпретируются терминалом или эмулятором терминала. (См. раздел документации вашего текстового терминала для разрешенных значений и их значений в качестве атрибутов символов.) Эти значения подстрок являются целыми числами в десятичном представлении и могут быть соединены точкой с запятой. Общие значения для объединения включают ‘1’ для жирности, ‘4’ для подчеркивания, ‘5’ для мигания, ‘7’ для инверсии, ‘39’ для стандартного цвета переднего плана, ‘30’ до ‘37’ для цветов переднего плана, ‘90’ до ‘97’ для цветов переднего плана в режиме 16 цветов, ‘38;5;0’ до ‘38;5;255’ для цветов переднего плана в режимах 88 и 256 цветов, ‘49’ для стандартного цвета заднего плана, ‘40’ до ‘47’ для цветов заднего плана, ‘100’ до ‘107’ для цветов заднего плана в режиме 16 цветов и ‘48;5;0’ до ‘48;5;255’ для цветов заднего плана в режимах 88 и 256 цветов.

Значение по умолчанию GCC_COLORS составляет

error=01;31:warning=01;35:note=01;36:range1=32:range2=34:locus=01:\
quote=01:path=01;36:fixit-insert=32:fixit-delete=31:\
diff-filename=01:diff-hunk=32:diff-delete=31:diff-insert=32:\
type-diff=01;32:fnname=01;32:targs=35

где ‘01;31’ – жирный красный, ‘01;35’ – жирный пурпурный, ‘01;36’ – жирный голубой, ‘32’ – зелёный, ‘34’ – синий, ‘01’ – жирный, и ‘31’ – красный. Установка GCC_COLORS в пустую строку отключает цвета. Поддерживаемые возможности перечислены ниже.

error=

Подстрока SGR для маркеров ошибок.

warning=

Подстрока SGR для маркеров предупреждений.

note=

Подстрока SGR для маркеров заметок.

path=

Подстрока SGR для раскрашивания путей событий потока управления, как напечатано с помощью -fdiagnostics-path-format=, таких как идентификаторы отдельных событий и строки, указывающие межпроцедурные вызовы и возвраты.

range1=

Подстрока SGR для первого дополнительного диапазона.

range2=

Подстрока SGR для второго дополнительного диапазона.

locus=

Подстрока SGR для информации о местоположении, ‘file:line’ или ‘file:line:column’ и т. д.

quote=

Подстрока SGR для информации, напечатанной в кавычках.

fnname=

Подстрока SGR для имён функций C++.

targs=

Подстрока SGR для привязок параметров шаблонов функций C++.

fixit-insert=

Подстрока SGR для подсказок исправления, предлагающих текст для вставки или замены.

fixit-delete=

Подстрока SGR для подсказок исправления, предлагающих текст для удаления.

diff-filename=

Подстрока SGR для заголовков файлов в сгенерированных патчах.

diff-hunk=

Подстрока SGR для начала блоков в сгенерированных патчах.

diff-delete=

Подстрока SGR для удалённых строк в сгенерированных патчах.

diff-insert=

Подстрока SGR для вставленных строк в сгенерированных патчах.

type-diff=

Подстрока SGR для выделения несовпадающих типов в аргументах шаблонов в фронтэнде C++.

-fdiagnostics-urls[=WHEN]

Использовать управляющие последовательности для вставки URL-адресов в диагностику. Например, когда -fdiagnostics-show-option выводит текст, показывающий командную опцию, управляющую диагностикой, вставить URL-адрес для документации этой опции.

WHEN может принимать значения ‘never’, ‘always’ или ‘auto’. ‘auto’ заставляет GCC использовать последовательности для вставки URL-адресов только тогда, когда стандартный вывод – терминал, и когда выполнение не происходит в оболочке emacs или любом графическом терминале, который известен как несовместимый с этой функцией, см. ниже.

Значение по умолчанию зависит от того, как был сконфигурирован компилятор. Оно может быть любым из вышеперечисленных вариантов WHEN.

GCC также может быть сконфигурирован (через опцию конфигурации --with-diagnostics-urls=auto-if-env) так, что значение по умолчанию зависит от переменных среды. При такой конфигурации GCC по умолчанию использует ‘auto’, если переменные среды GCC_URLS или TERM_URLS присутствуют и не пусты в среде компилятора, или ‘never’, если ни одна из них не присутствует.

Однако, даже с -fdiagnostics-urls=always поведение зависит от этих переменных среды: если GCC_URLS установлено в пустую строку или ‘no’, URL-адреса не вставляются в диагностику. Если установлено в ‘st’, URL-адреса используют последовательности ST. Если установлено в ‘bel’, по умолчанию, URL-адреса используют последовательности BEL. Любое другое ненулевое значение включает функцию. Если GCC_URLS не установлено, используется TERM_URLS в качестве резервного варианта. Примечание: ST – это ANSI-управляющая последовательность, разделитель строки ‘ESC \’, BEL – это ASCII-символ, CTRL-G, который обычно звучит как сигнал.

В настоящее время GCC пытается определить также несколько терминалов, которые, как известно, не реализуют функцию URL, и имеют ошибки или, по крайней мере, имели ошибки в некоторых используемых версиях, где управляющие последовательности URL, вероятно, будут работать неправильно, то есть печатать мусор на экране. В этот список входят xfce4-terminal, некоторые известные ошибочные версии gnome-terminal, консоль Linux и mingw. Этот проверка может быть пропущена с помощью -fdiagnostics-urls=always.

-fno-diagnostics-show-option

По умолчанию каждое выведенное сообщение о диагностике содержит текст, указывающий командную опцию, которая напрямую управляет диагностикой (если такая опция известна механизму диагностики). Указание флага -fno-diagnostics-show-option подавляет это поведение.

-fno-diagnostics-show-caret

По умолчанию каждое выведенное сообщение о диагностике включает исходную строку и символ «^» (каретку), указывающий колонку. Этот параметр подавляет эту информацию. Строка исходного кода усекается до n символов, если задан параметр -fmessage-length=n. При выводе на терминал ширина ограничена шириной, заданной переменной среды COLUMNS или, если она не задана, шириной терминала.

-fno-diagnostics-show-labels

По умолчанию, при печати исходного кода (с помощью -fdiagnostics-show-caret), сообщения о диагностике могут помечать диапазоны исходного кода соответствующей информацией, например, типами выражений:

printf ("foo %s bar", long_i + long_j);
             ~^       ~~~~~~~~~~~~~~~
              |              |
              char *         long int

Этот параметр подавляет печать этих пометок (в примере выше, вертикальных линий и текста «char *» и «long int»).

-fno-diagnostics-show-cwe

Сообщения о диагностике могут иметь связанный идентификатор CWE. Сам GCC предоставляет такую метаданные только для некоторых диагностических сообщений -fanalyzer. Плагины GCC также могут предоставлять сообщения о диагностике с такими метаданными. По умолчанию, если эта информация присутствует, она будет выводиться вместе с сообщением о диагностике. Этот параметр подавляет вывод этих метаданных.

-fno-diagnostics-show-rules

Сообщения об ошибках могут иметь связанные с ними правила, например, из стандарта кодирования или спецификации. Сам GCC этого не делает для своих сообщений об ошибках, но плагины могут. По умолчанию, если эта информация присутствует, она будет выводиться вместе с сообщением об ошибке. Этот параметр подавляет вывод этой метаданных.

-fno-diagnostics-show-line-numbers

По умолчанию, при выводе исходного кода (через -fdiagnostics-show-caret) печатается отступ слева, отображающий номера строк. Этот параметр подавляет вывод этого отступа слева.

-fdiagnostics-minimum-margin-width=width

Этот параметр управляет минимальной шириной левого отступа, выводимого с помощью -fdiagnostics-show-line-numbers. По умолчанию он равен 6.

-fdiagnostics-parseable-fixits

Выводить подсказки по исправлению в формате, пригодном для машинного анализа, подходящем для использования IDE. Для каждой подсказки по исправлению будет напечатана строка после соответствующего сообщения об ошибке, начинающаяся со строки «fix-it:». Например:

fix-it:"test.c":{45:3-45:21}:"gtk_widget_show_all"

Расположение выражается как полуоткрытый интервал, выраженный как количество байтов, начиная с байта 1 для начальной колонки. В приведенном выше примере байты с 3 по 20 строки 45 файла «test.c» необходимо заменить указанной строкой:

00000000011111111112222222222
12345678901234567890123456789
  gtk_widget_showall (dlg);
  ^^^^^^^^^^^^^^^^^^
  gtk_widget_show_all

Имя файла и строка замены экранируют обратную косую черту как «\\», табуляцию как «\t», новую строку как «\n», двойные кавычки как «\"», непечатаемые символы как восьмеричные (например, вертикальная табуляция как «\013»).

Пустая строка замены указывает на то, что указанный диапазон должен быть удалён. Пустой диапазон (например, «45:3-45:3») указывает на то, что строка должна быть вставлена в данную позицию.

-fdiagnostics-generate-patch

Выводить подсказки по исправлению в stderr в формате unified diff после вывода всех сообщений об ошибках. Например:

--- test.c
+++ test.c
@ -42,5 +42,5 @

 void show_cb(GtkDialog *dlg)
 {
-  gtk_widget_showall(dlg);
+  gtk_widget_show_all(dlg);
 }

Дифференциал может или не может быть окрашен, следуя тем же правилам, что и для сообщений об ошибках (см. -fdiagnostics-color).

-fdiagnostics-show-template-tree

В C++ переднем плане, при выводе сообщений об ошибках, показывающих несоответствие типов шаблонов, например:

could not convert 'std::map<int, std::vector<double> >()'
  from 'map<[...],vector<double>>' to 'map<[...],vector<float>>

Флаг -fdiagnostics-show-template-tree позволяет выводить древовидную структуру, показывающую общие и отличающиеся части типов, например:

map<
  [...],
  vector<
    [double != float]>>

Различия выделены цветом («double» и «float» в данном случае).

-fno-elide-type

По умолчанию, когда C++ фронтенд выводит сообщения об ошибках, показывающие несоответствие типов шаблонов, общие части типов выводятся как «[...]» для упрощения сообщения об ошибке. Например:

could not convert 'std::map<int, std::vector<double> >()'
  from 'map<[...],vector<double>>' to 'map<[...],vector<float>>

Указание флага -fno-elide-type подавляет это поведение. Этот флаг также влияет на вывод флага -fdiagnostics-show-template-tree.

-fdiagnostics-path-format=KIND

Указать, как выводить пути событий потока управления для сообщений об ошибках, с которыми связан такой путь.

KIND — это ‘none’, ‘separate-events’ или ‘inline-events’, по умолчанию.

‘none’ означает, что пути диагностики не выводить.

‘separate-events’ означает, что для каждого события внутри сообщения об ошибке выводится отдельное сообщение «note». Например:

test.c:29:5: error: passing NULL as argument 1 to 'PyList_Append' which requires a non-NULL parameter
test.c:25:10: note: (1) when 'PyList_New' fails, returning NULL
test.c:27:3: note: (2) when 'i < count'
test.c:29:5: note: (3) when calling 'PyList_Append', passing NULL from (1) as argument 1

‘inline-events’ означает, что события выводятся «встроенными» в исходный код. Эта визуализация пытается объединить события в серии достаточно близких событий, выводить их как помеченные диапазоны в исходном коде.

Например, те же события, что и выше, могут быть выведены так:

'test': events 1-3
  |
  |   25 |   list = PyList_New(0);
  |      |          ^~~~~~~~~~~~~
  |      |          |
  |      |          (1) when 'PyList_New' fails, returning NULL
  |   26 |
  |   27 |   for (i = 0; i < count; i++) {
  |      |   ~~~
  |      |   |
  |      |   (2) when 'i < count'
  |   28 |     item = PyLong_FromLong(random());
  |   29 |     PyList_Append(list, item);
  |      |     ~~~~~~~~~~~~~~~~~~~~~~~~~
  |      |     |
  |      |     (3) when calling 'PyList_Append', passing NULL from (1) as argument 1
  |

Межпроцедурный поток управления показан путём группировки событий по кадру стека и использованием отступов, чтобы показать, как кадры стека вложены, помещены и удалены.

Например:

'test': events 1-2
    |
    |  133 | {
    |      | ^
    |      | |
    |      | (1) entering 'test'
    |  134 |   boxed_int *obj = make_boxed_int (i);
    |      |                    ~~~~~~~~~~~~~~~~~~
    |      |                    |
    |      |                    (2) calling 'make_boxed_int'
    |
    +--> 'make_boxed_int': events 3-4
           |
           |  120 | {
           |      | ^
           |      | |
           |      | (3) entering 'make_boxed_int'
           |  121 |   boxed_int *result = (boxed_int *)wrapped_malloc (sizeof (boxed_int));
           |      |                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
           |      |                                    |
           |      |                                    (4) calling 'wrapped_malloc'
           |
           +--> 'wrapped_malloc': events 5-6
                  |
                  |    7 | {
                  |      | ^
                  |      | |
                  |      | (5) entering 'wrapped_malloc'
                  |    8 |   return malloc (size);
                  |      |          ~~~~~~~~~~~~~
                  |      |          |
                  |      |          (6) calling 'malloc'
                  |
    <-------------+
    |
 'test': event 7
    |
    |  138 |   free_boxed_int (obj);
    |      |   ^~~~~~~~~~~~~~~~~~~~
    |      |   |
    |      |   (7) calling 'free_boxed_int'
    |
(etc)
-fdiagnostics-show-path-depths

Этот параметр предоставляет дополнительную информацию при выводе путей потока управления, связанных с сообщением об ошибке.

Если этот параметр предоставлен, глубина стека будет выводиться для каждой серии событий в -fdiagnostics-path-format=inline-events. Если предоставлен с -fdiagnostics-path-format=separate-events, то глубина стека и объявление функции будут добавлены при выводе каждого события.

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

-fno-show-column

Не выводить номера столбцов в сообщениях об ошибках. Это может быть необходимо, если сообщения об ошибках сканируются программой, которая не понимает номера столбцов, например dejagnu.

-fdiagnostics-column-unit=UNIT

Выберите единицы для номера столбца. Это влияет на традиционные сообщения об ошибках (при отсутствии -fno-show-column), а также на сообщения об ошибках в формате JSON, если они запрошены.

По умолчанию UNIT, ‘display’, учитывает количество отображаемых столбцов, занимаемых каждым символом. Это может быть больше, чем количество байтов, необходимых для кодирования символа, в случае символов табуляции, или меньше, в случае многобайтовых символов. Например, символ «GREEK SMALL LETTER PI (U+03C0)» занимает один столбец, а его UTF-8 кодирование занимает два байта; символ «SLIGHTLY SMILING FACE (U+1F642)» занимает два столбца, а его UTF-8 кодирование занимает четыре байта.

Установка UNIT на ‘byte’ изменяет номер столбца на исходное количество байтов во всех случаях, как это традиционно выводилось GCC до версии 11.1.0.

-fdiagnostics-column-origin=ORIGIN

Выбрать начало отсчёта для номеров столбцов, т.е. номер столбца, присвоенный первому столбцу. Значение по умолчанию 1 соответствует традиционному поведению GCC и руководству GNU. Некоторые утилиты могут работать лучше при нулевом начале; любое неотрицательное значение может быть указано.

-fdiagnostics-escape-format=FORMAT

Когда GCC выводит релевантные строки исходного кода для сообщения об ошибке, он обычно пытается вывести исходные байты напрямую. Однако некоторые сообщения об ошибках относятся к проблемам кодирования в файле исходного кода, например, к некорректному UTF-8 или проблемам с нормализацией Unicode. Эти сообщения об ошибках помечены, чтобы GCC экранировал байты, которые не являются печатаемыми ASCII, при выводе соответствующих строк исходного кода.

Этот параметр управляет тем, как следует экранировать такие байты.

По умолчанию FORMAT, ‘unicode’ отображает символы Unicode, которые не являются печатаемыми ASCII, в форме ‘<U+XXXX>’, а байты, которые не соответствуют символу Unicode, корректно закодированному в UTF-8, будут отображаться в шестнадцатеричном формате ‘<XX>’.

Например, строка исходного кода, содержащая строку ‘before’, за которой следует символ Unicode U+03C0 («GREEK SMALL LETTER PI», с UTF-8 кодированием 0xCF 0x80), за которым следует байт 0xBF (остаточный байт UTF-8), за которым следует строка ‘after’, будет выводиться для такого сообщения об ошибке как:

before<U+03C0><BF>after

Установка FORMAT на ‘bytes’ отобразит все непечатаемые ASCII байты в форме ‘<XX>», таким образом показав базовое кодирование не-ASCII символов Unicode. Для примера выше, будет выведено следующее:

before<CF><80><BF>after
-fdiagnostics-format=FORMAT

Выберите другой формат для печати диагностических сообщений. FORMAT — это ‘text’, ‘sarif-stderr’, ‘sarif-file’, ‘json’, ‘json-stderr’ или ‘json-file’.

По умолчанию используется ‘text’.

Форматы ‘sarif-stderr’ и ‘sarif-file’ выводят диагностические сообщения в формате SARIF версии 2.1.0, соответственно, в стандартный поток ошибок или в файл с именем source.sarif.

Формат ‘json’ является синонимом для ‘json-stderr’. Форматы ‘json-stderr’ и ‘json-file’ идентичны, за исключением места вывода JSON — в первом случае JSON выводится в стандартный поток ошибок, а во втором — в файл source.gcc.json.

Выводимый JSON представляет собой массив JSON верхнего уровня, содержащий объекты JSON, представляющие диагностические сообщения. JSON выводится в одну строку без форматирования; примеры ниже отформатированы для большей ясности.

Диагностические сообщения могут иметь дочерние диагностические сообщения. Например, эта ошибка и примечание:

misleading-indentation.c:15:3: warning: this 'if' clause does not
  guard... [-Wmisleading-indentation]
   15 |   if (flag)
      |   ^~
misleading-indentation.c:17:5: note: ...this statement, but the latter
  is misleadingly indented as if it were guarded by the 'if'
   17 |     y = 2;
      |     ^

могут быть напечатаны в формате JSON (после форматирования) следующим образом:

[
    {
        "kind": "warning",
        "locations": [
            {
                "caret": {
		    "display-column": 3,
		    "byte-column": 3,
                    "column": 3,
                    "file": "misleading-indentation.c",
                    "line": 15
                },
                "finish": {
		    "display-column": 4,
		    "byte-column": 4,
                    "column": 4,
                    "file": "misleading-indentation.c",
                    "line": 15
                }
            }
        ],
        "message": "this \u2018if\u2019 clause does not guard...",
        "option": "-Wmisleading-indentation",
        "option_url": "https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wmisleading-indentation",
        "children": [
            {
                "kind": "note",
                "locations": [
                    {
                        "caret": {
			    "display-column": 5,
			    "byte-column": 5,
                            "column": 5,
                            "file": "misleading-indentation.c",
                            "line": 17
                        }
                    }
                ],
                "escape-source": false,
                "message": "...this statement, but the latter is …"
            }
        ]
	"escape-source": false,
	"column-origin": 1,
    }
]

где note является дочерним элементом warning.

Диагностическое сообщение имеет kind. Если это warning, то есть ключ option, описывающий командную опцию, контролирующую предупреждение.

Диагностическое сообщение может содержать ноль или более местоположений. Каждое местоположение имеет необязательную строку label и до трех позиций в ней: позицию caret, и необязательные позиции start и finish. Позиция описывается именем file, номером line и тремя числами, указывающими позицию столбца:

  • display-column считает столбцы отображения, учитывая табуляцию и многобайтовые символы.
  • byte-column считает исходные байты.
  • column равно одному из двух предыдущих, как диктует опция -fdiagnostics-column-unit.

Все три столбца относятся к началу, указанному опцией -fdiagnostics-column-origin, которая обычно равна 1, но может быть установлена, например, в 0 для совместимости с другими утилитами, которые нумеруют столбцы с 0. Начальная позиция столбца записывается в выводе JSON в теге column-origin. В оставшихся примерах ниже дополнительные выводы номера столбца опущены для краткости.

Например, эта ошибка:

bad-binary-ops.c:64:23: error: invalid operands to binary + (have 'S' {aka
   'struct s'} and 'T' {aka 'struct t'})
   64 |   return callee_4a () + callee_4b ();
      |          ~~~~~~~~~~~~ ^ ~~~~~~~~~~~~
      |          |              |
      |          |              T {aka struct t}
      |          S {aka struct s}

имеет три местоположения. Главное местоположение находится на токен “+” в столбце 23. Она имеет два дополнительных местоположения, описывающие левую и правую части выражения, которые имеют метки. Она может быть напечатана в формате JSON как:

{
    "children": [],
    "kind": "error",
    "locations": [
        {
            "caret": {
                "column": 23, "file": "bad-binary-ops.c", "line": 64
            }
        },
        {
            "caret": {
                "column": 10, "file": "bad-binary-ops.c", "line": 64
            },
            "finish": {
                "column": 21, "file": "bad-binary-ops.c", "line": 64
            },
            "label": "S {aka struct s}"
        },
        {
            "caret": {
                "column": 25, "file": "bad-binary-ops.c", "line": 64
            },
            "finish": {
                "column": 36, "file": "bad-binary-ops.c", "line": 64
            },
            "label": "T {aka struct t}"
        }
    ],
    "escape-source": false,
    "message": "invalid operands to binary + …"
}

Если диагностическое сообщение содержит подсказки исправления, у него есть массив fixits, состоящий из полуоткрытых интервалов, аналогичных выводу опции -fdiagnostics-parseable-fixits. Например, это диагностическое сообщение с подсказкой исправления заменой:

demo.c:8:15: error: 'struct s' has no member named 'colour'; did you
  mean 'color'?
    8 |   return ptr->colour;
      |               ^~~~~~
      |               color

может быть напечатано в формате JSON как:

{
    "children": [],
    "fixits": [
        {
            "next": {
                "column": 21,
                "file": "demo.c",
                "line": 8
            },
            "start": {
                "column": 15,
                "file": "demo.c",
                "line": 8
            },
            "string": "color"
        }
    ],
    "kind": "error",
    "locations": [
        {
            "caret": {
                "column": 15,
                "file": "demo.c",
                "line": 8
            },
            "finish": {
                "column": 20,
                "file": "demo.c",
                "line": 8
            }
        }
    ],
    "escape-source": false,
    "message": "\u2018struct s\u2019 has no member named …"
}

где подсказка исправления предлагает заменить текст с start до, но не включая next на значение string. Удаления выражаются пустым значением для string, вставки — значением start равным next.

Если диагностическое сообщение содержит путь событий потока управления, ассоциированных с ним, оно имеет массив path объектов, представляющих события. Каждый объект события имеет строку description, объект location, а также строку function и число depth для представления межпроцедурных путей. function представляет текущую функцию в этом событии, а depth представляет глубину стека относительно некоторой базовой точки: чем больше, тем больше фреймов находится в стеке.

Например, внутрипроцедурный пример, показанный для -fdiagnostics-path-format=, может иметь этот JSON для своего пути:

"path": [
    {
        "depth": 0,
        "description": "when 'PyList_New' fails, returning NULL",
        "function": "test",
        "location": {
            "column": 10,
            "file": "test.c",
            "line": 25
        }
    },
    {
        "depth": 0,
        "description": "when 'i < count'",
        "function": "test",
        "location": {
            "column": 3,
            "file": "test.c",
            "line": 27
        }
    },
    {
        "depth": 0,
        "description": "when calling 'PyList_Append', passing NULL from (1) as argument 1",
        "function": "test",
        "location": {
            "column": 5,
            "file": "test.c",
            "line": 29
        }
    }
]

Диагностические сообщения имеют булевое свойство escape-source, указывающее, следует ли экранировать не-ASCII байты при печати соответствующих строк исходного кода (true для диагностических сообщений, связанных с проблемами кодировки исходного кода).

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Diagnostic-Message-Formatting-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API