Intereting Posts
Правильный способ инициализации строки в C C – Убедитесь, что int, считываемый scanf, находится в диапазоне целых чисел чтение неизвестного числа целых чисел из stdin (C) Чтение файла с использованием fgets и печать его содержимого на экране Как вы включаете стандартные библиотеки CUDA для связи с кодом NVRTC? Сила / Уклонение / Уловка GCC в разворот _Longer_ Loops? Программа c из бумаги GATE Передайте черту ржавчины на C Печать строкового символа с помощью char с задержкой после каждого символа Вывести хороший символ «block» с ncurses и C ++? kill – он сразу же уничтожает процесс? сравнение номеров версий в c Не удалось загрузить файл или сборку Ошибка Microsoft.Data.OData Версия = 5.2.0.0 в роли рабочего агента Azure с использованием хранилища таблиц битное смещение с неподписанным длинным типом приводит к неправильным результатам правильно объявляя функцию main () в ANSI C

Каковы ограничения в стандарте C?

Стандарты C говорят о ограничениях , например, ISO / IEC 9899: 201x определяет термин

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

и говорится в главе « Соответствие»

Если требование ” должно ” или ‘не должно’ ‘, которое появляется за пределами ограничения или ограничения времени выполнения, нарушено, поведение не определено.

В главе Environment , Subsection Diagnostics сказано

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

Поэтому важно знать, каковы ограничения в C, например, для писателей компилятора, чтобы судить о необходимости диагностики или для программистов C, когда можно ожидать диагностики, а не просто неопределенного поведения.
Теперь во всем стандартном документе есть разделы с ограничениями заголовков, но я не могу найти окончательной формулировки относительно того, что именно ограничивает термин ограничение в стандарте.

  • Являются ли ограничения все, что появляется в разделах под названием « Ограничения» ?
  • Является ли каждое требование, которое указано за пределами этих разделов, не является ограничением?
  • Есть ли исчерпывающее описание ограничений в стандарте, который я пропустил?

Являются ли ограничения все, что появляется в разделах под названием «Ограничения»?

В смысле n1570 3.8 (ограничение, налагаемое на программы, для которых требуется соответствующая реализация для выдачи диагностического сообщения времени компиляции при нарушении), я думаю, да.

Является ли каждое требование, которое указано за пределами этих разделов, не является ограничением?

В смысле 3.8, я думаю, да, но для более круговой причины: структура стандарта довольно формальна. Всякий раз, когда это применимо, существует явный раздел ограничений . Поэтому я понимаю, что по определению все, что не находится в разделе « Ограничения », не является ограничением в смысле 3.8.
Существует несколько разделов «must» вне разделов Constraints, которые полностью исполняются во время компиляции, ср. ниже для нескольких примеров. Они часто находятся в смежных разделах Семантики . Возможно, мне недостает тонкостей, которые предотвращают обнаружение времени компиляции в общем случае (так что диагноз не может быть обязательным), или, может быть, стандарт не полностью согласован. Но я бы подумал, что компилятор может просто перевести нарушающую программу, именно потому, что требования не находятся в разделе « Ограничения ».

Есть ли исчерпывающее описание ограничений в стандарте, который я пропустил?

Я думаю, что 3.8 – это все, что вы получаете. Я пытаюсь изучить приведенный ниже термин и соглашаюсь с тем, что это определение неудовлетворительное.


Я посмотрел глубже в стандарт, чтобы понять это. Вот мои исследования.

Термин « ограничение»

Начнем с основ. Определение «ограничения» в 3.8, которое вы цитируете, на удивление трудно понять, по крайней мере, без контекста («ограничение, синтаксическое или семантическое, с помощью которого должно интерпретироваться выражение языковых элементов»). «Ограничение» и «ограничение» являются синонимами, так что перестановка не добавляет многого; и что подразумевается под «изложением языковых элементов»? Экспозиция – это слово с несколькими значениями; давайте возьмем «письмо или речь, в первую очередь предназначенную для передачи информации» от Dictionary.com , и предположим, что они означают стандарт с этим. Тогда это означает, что ограничение в этом стандарте является ограничением того, что сказано в этом стандарте. Ого, я бы не догадался.

Ограничения по 3.8

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

Ограничения во внешних разделах ограничений

В большинстве случаев использование «должно» вне секций « Ограничения» накладывает ограничения на соответствующую реализацию . Пример: «Все объекты со статической продолжительностью хранения должны быть инициализированы (установлены на их начальные значения) до запуска программы», задание соответствующей реализации.

Есть несколько положений «должны», налагающие ограничения на программу (а не на реализацию) за пределами секций ограничений . Я бы сказал, что большинство относятся к той же категории, что и «ограничения времени выполнения […] в программе при вызове библиотечной функции», упомянутой в 3.18. Кажется, что они являются ограничениями времени выполнения, которые обычно не обнаруживаются во время компиляции (так что диагностика не может быть обязательной).

Вот несколько примеров.

В 6.5 / 7 n1570 подробно описываются правила сглаживания:

Объект должен иметь сохраненное значение, к которому обращается только выражение lvalue, которое имеет один из следующих типов:

  • тип, совместимый с эффективным типом объекта
  • квалифицированная версия типа, совместимая с эффективным типом объекта, […]

В пункте 6.5.16.1 «Простое назначение»:

Если значение, хранящееся в объекте, считывается из другого объекта, который каким-либо образом перекрывает хранение первого объекта, то перекрытие должно быть точным [..]. ”

Другие примеры относятся к арифметике указателей (6.5.6 / 8).

Предложения, которые могут быть в разделах « Ограничения»

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

  • 6.6 / 6, «Операторы трансляции в целочисленном постоянном выражении должны преобразовывать только арифметические типы в целые типы» (в разделе «Семантика»); что вы можете обнаружить во время компиляции, если не можете обнаружить типы констант и приведения?
  • 6.7 / 7: «Если идентификатор объекта объявлен без привязки, тип объекта должен быть завершен до конца его декларатора» (в разделе «Семантика»). Мне кажется, что это основная задача компилятора, чтобы определить, завершен ли тип в какой-то момент кода. Но, конечно, я никогда не писал компилятор C.

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


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

Комитет С рассмотрел этот вопрос в ответ на Отчет о дефектах № 033 . Вопрос в этом отчете о дефектах был следующим:

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

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

Правила синтаксиса – это те элементы, которые перечислены в разделах синтаксиса стандарта. Ограничения – это те элементы, которые указаны в разделе « Ограничения» стандарта.

Часть ответа комитета была:

Рекомендуемая интерпретация № 2 является правильной.

Я считаю, что ваши вопросы достаточно справедливы, но просто для того, чтобы напрямую ответить на ваши вопросы:

  • Являются ли ограничения все, что появляется в разделах под названием «Ограничения»?
  • Является ли каждое требование, которое указано за пределами этих разделов, не является ограничением?

«Ограничение» – это требование, указанное в разделе, явно помеченном «Ограничения». Любое требование, заявленное вне такого раздела, не является ограничителем.

  • Есть ли исчерпывающее описание ограничений в стандарте, который я пропустил?

По крайней мере, насколько мне известно, сам стандарт не содержит более конкретного утверждения о том, что является или не является ограничением, но связанный отчет о дефектах.

Являются ли ограничения все, что появляется в разделах под названием «Ограничения»?

Похоже, что они в основном (есть некоторые случаи, которые не являются, fx: указано, что «Приращение эквивалентно добавлению 1» в одном из разделов ограничений).

Является ли каждое требование, которое указано за пределами этих разделов, не является ограничением?

Я не видел «ограничений» вне этих разделов.

Есть ли исчерпывающее описание ограничений в стандарте, который я пропустил?

Наверное, нет, если бы были такие авторитетные, это было бы в стандарте и, вероятно, было бы секцией «ограничения» (и явно упоминалось, что все это «ограничения»).

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

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

Однако, как представляется, существует немало примеров «должно» и «не должно», которые могут быть приняты такими ограничениями, которые явно не называются таковыми. Это оставило бы все случаи «должны» и «не должны» давать или запрещать определенное поведение реализации, и если они не выполняются, то да, поведение может быть неопределенным (поскольку вы используете реализацию, t соответствует стандарту).

Похоже, что все, что соответствует определению «ограничение», похоже, встречается в разделе «ограничение», и все разделы «ограничения» кажутся «ограничениями».

Являются ли ограничения все, что появляется в разделах под названием « Ограничения» ?

Да. Все синтаксические и семантические ограничения, упомянутые в стандарте, являются ограничениями.

Например, ограничение на константные выражения (C11-6.6 / 3):

Константные выражения не должны содержать операции присваивания, приращения, декремента, функции-вызова или запятой, кроме случаев, когда они содержатся в подвыражении, которое не оценивается. 115)

Поэтому постоянные выражения

 3 = 5; 10++; 

показывает нарушение ограничений.

Обратите внимание, что в этом случае требование, а также ограничение обоих нарушаются.

Является ли каждое требование, которое указано за пределами этих разделов, не является ограничением?

Для стандартного соответствия C да. Требование A к целочисленному постоянному выражению (C11-6.6 / 6):

Целочисленное константное выражение 117) должно иметь целочисленный тип […]

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

 int arr[5+1.5]; 

нарушает требование. Тип выражения 5+1.5 не является целым типом. Это требование должно быть ограничено.

Следует отметить, что требование также может быть ограничением.

В моей работе по разработке требований слова «ограничение» и «требование» имеют разный объем. Для стандартного также важно четко определить их. Я искал слово «ограничение» в стандарте и, похоже, могу сделать следующий вывод:

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

Требование является частью спецификации поведения раздела стандарта. «Должен» – положительное описание того, что требуется; «не должен», как правило, ограничивать, но не ограничивать – он может участвовать, хотя и встречает ограничение на его выход.

Ограничения и требования можно рассматривать как «внешние интерфейсы» (ограничения) и «поведение / обработка системы» (требования).

Как правило, это означает требование (фраза без «должна», следовательно, не является требованием). «Shall», используемый в ограничении, либо используется для определения ввода или вывода (например, argc должен быть положительным), либо указывает поведение, связанное с проверкой ограничения (например, «… должно дать диагностическое сообщение»).

Строго говоря, «должен», используемый при определении поведения проверки входного ограничения, не следует указывать в разделе ограничений (не следует указывать в спецификации интерфейса), а в разделе обработки (раздел поведения).

Обратите внимание, что проверка выходного ограничения не может быть подтверждена, так как вывод должен соответствовать спецификации; только следующий uit может проверить эти ограничения, если они находятся в своих входных ограничениях.

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

ограничение

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

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

Является ли каждое требование, которое указано за пределами этих разделов, не является ограничением?

Я думаю, что все явные требования к программированию на языке C падают либо под синтаксическим, либо с семантическим ограничением.

Есть ли исчерпывающее описание ограничений в стандарте, который я пропустил?

Насколько мне известно.