Что такое диагностика компилятора? - PullRequest
1 голос
/ 04 июля 2019

Я обычно говорю «предупреждение компилятора», «ошибка компилятора».Поэтому, когда я слышу «диагностические сообщения компилятора» или просто «диагностику компилятора», я немного не уверен, являются ли они обычным «предупреждением компилятора», «ошибкой компилятора» или чем-то другим?

Ответы [ 3 ]

6 голосов
/ 04 июля 2019

Диагностическое сообщение фактически определяется стандартом как

[defns.diagnostic]

, принадлежащее реализации-определенное подмножество выходных сообщений реализации

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

0 голосов
/ 09 июля 2019

Многое во многих стандартах заключается не только в том, что им требуется для всех соответствующих экземпляров, но и в том, что они рекомендуют делать, когда это целесообразно, в качественных случаях.Авторы Стандарта C89, однако, изо всех сил старались не предлагать какие-либо такие рекомендации для чего-то, что не требовалось.Если бы C89 рекомендовал, например, чтобы реализации обрабатывали реляционные операторы на указателях способом, совместимым с глобальным транзитивным отношением, это могло бы рассматриваться как подразумевающее, что реализации, где это было бы непрактично, были каким-то образом неполноценными.

АвторыСтандарт не хотел запретить соответствующим реализациям полезную обработку кода, который предшествовал Стандарту и не удовлетворял его требованиям, но также не особо хотел подразумевать, что реализации должны принимать новый код, который не соответствует требованиям.Требования, что соответствующая реализация должна осмысленно обрабатывать по крайней мере одну программу или что реализация с заданным исходным текстом, который нарушает ограничения во время компиляции, должны производить по крайней мере одну диагностику, являются чем-то вродеуклоняться от жестких требований и рекомендаций.Предположительно, качественная реализация должна быть способна с пользой обрабатывать что-то, кроме одного надуманного (и, возможно, бесполезного) исходного текста, и должна производить некоторые диагностические операции, которые являются более полезными, чем «Предупреждение: эта реализация не будет выводить никакой диагностики, кроме этой", но реализация могла бы удовлетворить Стандарт, не выходя за рамки вышесказанного.

0 голосов
/ 04 июля 2019

«Диагностическое сообщение» - это термин искусства в стандарте C ++. Скорее всего, когда кто-то говорит «диагностика компилятора», он смутно думает об этом термине, но не применяет его правильно.

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

Большинство требований в стандарте содержатся в «наборе диагностируемых правил ». Эти правила состоят из всех синтаксических и семантических требований в стандарте, за исключением тех, которые явно помечены как «не требующие диагностики», и тех, которые описаны как приводящие к «неопределенному поведению». (Это из [intro.compliance] / 1).

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

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

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

Поэтому, когда компилятор говорит вам, что вы должны добавить круглые скобки вокруг операций || в if (a && b || c && d), это просто болтовня. Код действителен, его значение четко определено, и он просто дает вам совет по стилю (и плохой совет).

Когда он сообщает, что не знает тип x в typedef int foo; fo0 x;, он отвечает на диагностируемую ошибку. Если документация реализации говорит вам, что это сообщение является диагностическим сообщением, то это то, чем оно является. И вообще это то, что делают компиляторы.

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

Компиляторы обычно различают предупреждения и ошибки; стандарт не делает. Требуется, чтобы при представлении кода, который не нарушал ни одного из требований стандарта, и если программа не слишком велика (в неопределенном смысле), компилятор должен создавать исполняемую программу. Формально это так: «Если программа не содержит нарушений правил в этом международном стандарте, соответствующая реализация должна в пределах своих ресурсов принять и правильно выполнить эту программу». [Intro.compliance] /2.

...