Является ли разыменование указателя, равного nullptr, неопределенным поведением по стандарту?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Является ли разыменование указателя, равного nullptr, неопределенным поведением по стандарту?

Сообщение Anonymous »

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

Выражение '&podhd->line6' представляет собой неопределенное поведение в языке C
когда 'podhd' является нулевым указателем.
Стандарт C99 говорит следующее об операторе адреса '&'
(6.5.3.2 «Операторы адреса и косвенности»):
Операнд унарного оператора & должен быть либо указателем функции
, результатом операции [] или унарного *, либо lvalue, которое
обозначает объект, который не является битовым полем и не объявлен с
описателем класса хранения регистра.
Выражение 'podhd->line6' явно не является указателем функции,
результатом оператора [] или *. Это выражение lvalue. Однако
когда указатель 'podhd' имеет значение NULL, выражение не обозначает
объект, поскольку в разделе 6.3.2.3 «Указатели» говорится:
Если константа нулевого указателя преобразуется в тип указателя,
результирующий указатель, называемый нулевым указателем, гарантированно будет сравниваться
не с указателем на любой объект или функцию.
/>Когда «lvalue не обозначает объект при его вычислении,
поведение не определено» (C99 6.3.2.1 «Lvalues, массивы и указатели функций
»):
lvalue — это выражение с типом объекта или неполным типом
отличным от void; если lvalue не обозначает объект при
вычислении, поведение не определено.
Итак, вкратце та же идея:
Когда -> был выполнен над указателем, он вычислил значение lvalue, в котором
объекта не существует, и в результате поведение не определено.

Этот вопрос чисто языковой, я не спрашиваю, позволяет ли данная система вмешиваться в то, что находится по адресу 0 на любом языке.
Насколько я вижу, нет никаких ограничений на разыменование переменной-указателя, значение которой равно nullptr, даже если сравнивать указатель с nullptr (или (void *) 0) константа может исчезать при оптимизации в определенных ситуациях из-за указанных абзацев, но это похоже на другую проблему, она не предотвращает разыменование указателя, значение которого равно nullptr. Обратите внимание, что я проверил другие вопросы и ответы SO, мне особенно нравится этот набор цитат, а также стандартные кавычки выше, и я не наткнулся на что-то, что явно выводит из стандарта, что если указатель ptr сравнивается с nullptr, его разыменование будет неопределенным поведением.
В лучшем случае я получаю отклонение константы (или ее приведения к любому тип указателя) — это то, что такое UB, но ничего не говорится о переменной, которая побитно равна значению, полученному из nullptr.
Я хотел бы четко отделить константу nullptr от переменной-указателя, которая содержит значение, равное ей. Но ответ, охватывающий оба случая, идеален.
Я понимаю, что оптимизация может ускориться, когда есть сравнения с nullptr и т. д., и может просто удалить код на основе этого.
Если вывод таков, что если ptr равен значению nullptr, то разыменование определенно является UB, другой вопрос следующее:
Подразумевают ли стандарты C и C++, что в адресном пространстве должно существовать специальное значение исключительно для представления значения нулевых указателей?

Подробнее здесь: https://stackoverflow.com/questions/285 ... by-the-sta
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»