Spec-Zone.ru › GCC 14

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

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

-fmessage-length=n

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

Примечание: этот параметр также влияет на отображение директив препроцессора «#error» и «#warning», а также атрибута функции/типа/переменной «deprecated». Однако он не влияет на псевдодирективы «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
-fdiagnostics-text-art-charset=none

В будущем, если 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:valid=01;31:invalid=01;32

где ‘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++.

valid=

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

invalid=

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

-fdiagnostics-urls[=WHEN]

По умолчанию каждое выводимое диагностическое сообщение включает текст, указывающий командную строку, которая непосредственно управляет диагностикой (если такая опция известна механизму диагностики). Указание флага -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’ означает вывести отдельное диагностическое сообщение «примечание» для каждого события в диагностическом сообщении. Например:

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’, учитывает количество столбцов отображения, занимаемых каждым символом. Это может быть больше, чем количество байтов, необходимых для кодирования символа, в случае символов табуляции, или может быть меньше, в случае многобайтовых символов. Например, символ «ГРЕЧЕСКАЯ МАЛЕНЬКАЯ БУКВА ПИ (U+03C0)» занимает один столбец отображения, а его кодировка UTF-8 требует двух байтов; символ «СЛЕГКА УЛЫБАЮЩИЙСЯ ЛИЦО (U+1F642)» занимает два столбца отображения, а его кодировка UTF-8 требует четырех байтов.

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

-fdiagnostics-column-origin=ORIGIN

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

-fdiagnostics-escape-format=FORMAT

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

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

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

Например, строка исходного кода, содержащая строку ‘before’, за которой следует символ Unicode U+03C0 («ГРЕЧЕСКАЯ МАЛЕНЬКАЯ БУКВА ПИ», с кодировкой 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-text-art-charset=CHARSET

Некоторые диагностические сообщения могут содержать диаграммы «текстового искусства»: визуализации, созданные из текста, предназначенные для просмотра в моноширинном шрифте.

Этот параметр выбирает символы, которые должны использоваться для печати таких диаграмм, если таковые имеются. CHARSET может принимать значения ‘none’, ‘ascii’, ‘unicode’ или ‘emoji’.

Значение ‘none’ подавляет вывод таких диаграмм. Значение ‘ascii’ обеспечит, что такие диаграммы будут чистым ASCII («ASCII-art»). Значение ‘unicode’ позволит использовать символы рисования Unicode (такие как символы рисования рамки). Значение ‘emoji’ добавляет возможность использования смайликов в выводе (например, выводит U+26A0 ЗНАК ПРЕДУПРЕЖДЕНИЯ, за которым следует U+FE0F СЕЛЕКТОР ИЗМЕНЕНИЯ-16 для выбора варианта эмодзи символа).

По умолчанию используется ‘emoji’, за исключением случаев, когда переменная среды LANG установлена в ‘C’, в этом случае значение по умолчанию — ‘ascii’.

-fdiagnostics-format=FORMAT

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

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

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

Формат ‘json’ является синонимом ‘json-stderr’. Форматы ‘json-stderr’ и ‘json-file’ идентичны, за исключением места вывода JSON — в первом случае JSON выводится в stderr, а во втором — в файл source.gcc.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 для диагностических сообщений, связанных с проблемами кодировки исходного текста).

-fno-diagnostics-json-formatting

По умолчанию, когда для диагностических сообщений выводится JSON (через -fdiagnostics-format=sarif-stderr, -fdiagnostics-format=sarif-file, -fdiagnostics-format=json, -fdiagnostics-format=json-stderr, -fdiagnostics-format=json-file), GCC добавит новые строки и отступы, чтобы визуально подчеркнуть иерархическую структуру JSON.

Используйте -fno-diagnostics-json-formatting, чтобы отключить эти пробелы. Его необходимо указать до опции, на которую он влияет.

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

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

Spec-Zone.ru

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