Автор блога поднял дискуссию о разыменовании нулевого указателя.
Я привел здесь несколько контраргументов.
Его основная линия рассуждений, цитирующая стандарт, такова:
Выражение '&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
Является ли разыменование указателя, равного nullptr, неопределенным поведением по стандарту? ⇐ C++
Программы на C++. Форум разработчиков
1761140288
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++, что в адресном пространстве должно существовать специальное значение исключительно для представления значения нулевых указателей?
Подробнее здесь: [url]https://stackoverflow.com/questions/28573215/is-dereferencing-a-pointer-thats-equal-to-nullptr-undefined-behavior-by-the-sta[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия