Документация преобразования "недопустимое значение указателя" в реализациях С++

В соответствии со стандартом С++ для каждой реализации обязательно указывать "поведение, определяемое реализацией":

1.3.11 [defns.impl.defined] поведение, определяемое реализацией

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

И чтение недопустимого значения указателя имеет поведение, определяемое реализацией (см. 4.1 Преобразование Lvalue-to-rval [conv.lval]):

если объект, к которому относится ссылка glvalue, содержит недопустимое значение указателя (3.7.4.2, 3.7.4.3), поведение определяется реализацией.

(цитата из проекта n4527, но словосочетание "Неправильное использование недопустимого значения указателя и передача недопустимого значения указателя функции деаллокации имеют поведение undefined. Любое другое использование недопустимого значения указателя имеет поведение, определяемое реализацией". был в разделе 3.7.4.2. Функции освобождения [basic.stc.dynamic.deallocation], поскольку по крайней мере черновик n3485)

Однако многие популярные реализации не определяют это поведение, и многие эксперты описывают это как "поведение undefined".

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

Является ли это дефектом в стандарте и существуют ли какие-либо открытые отчеты об ошибках или действия комитета, предпринятые с момента его появления на С++ 14?

Ответ 1

CWG # 1438 изменил семантику относительно недопустимых значений указателя:

В текущем Стандарте говорится, что любое использование недопустимого значения указателя производит поведение undefined (3.7.4.2 [basic.stc.dynamic.deallocation] пункт 4). Это включает в себя не только разыменование указателя, но даже просто получая его ценность. Причина этого драконов ограничение в том, что некоторые архитектуры в прошлом использовали выделенные адресные регистры для указательных нагрузок и хранилищ, и они могут быть повреждены если, например, номер сегмента в указателе не был нанесены на карту.

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

Изменение в [conv.lval] - это разрешение CWG # 616, которое в основном приняло вышеуказанное.
Поднятие этого из UB для реализации, определяемого реализацией, было преднамеренным, поэтому я предполагаю, что отсутствие этого абзаца в Индексе является надзором.