170 похожих чатов

Вот у меня вопросец. Положим есть у меня некое оборудование,

и оно мапит свой, ну, скажем, регистр на адрес 0xDEADBEEF.

Соответственно, когда в программе я пытаюсь написать

*((int*)0xDEADBEEF) = 1

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

Вопрос: насколько валидно с точки зрения стандарта С++ выглядит попытка записать значение по адресу, по которому как бы нет проинициализированного объекта. Это UB или не UB?

19 ответов

20 просмотров

Это серая зона. В стандарте (коллеги поправят, если я ошибаюсь) подобные операции оговорены примерно никак.

Если мне не изменяет память станларт оговаривает только *((*int)0x1) = 1; int a = *((*int)0x1); // a == 1

netricks
Это серая зона. В стандарте (коллеги поправят, есл...

Для общего случая разрешений нет. Маппинг чисел в указатели - IDB, но доступ в объект вне лайфтайма (int в этом случае) - неопределенное поведение. Можно положиться на гарантии конкретной имплементации, но код перестанет быть стандартным, разумеется. @pavel_zhigulin

volatile не забудьте, а то компилятор оптимизирует это

Sergey Anisimov
Для общего случая разрешений нет. Маппинг чисел в ...

доступ в объект вне лайфтайма А кто сказал, что вне?) Указатель-то "внешний", и доказать (а благодаря volatile - и оптимизировать) компилятор ничего не сможет...

Dmitriy [Отпуск]
доступ в объект вне лайфтайма А кто сказал, что вн...

С т.з. абстрактной машины - вне. Порядок создания объектов строго оговорен. Опять же, закладываться на гарантии имплементации (вернее - конформным имплементациям их предоставлять) разрешается, но только так.

Sergey Anisimov
С т.з. абстрактной машины - вне. Порядок создания ...

Да-да, с т.з. абстрактной машины внешнего кода вообще не существует)

Michael Chambers
Как-будто есть какие-то варианты...

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

Dmitriy [Отпуск]
Да, asm/C

Гм, а есть актуальный драфт C в свободном доступе? Емнип, совсем по случайным адресам все еще нельзя было...

Это 100% UB.

netricks
Это серая зона. В стандарте (коллеги поправят, есл...

Нет, это UB, поскольку по этому адресу никто никогда не создавал объект типа int.

недавно обсуждали это дело после анонса 23++. это как раз вопрос про лайф тайм, про смешивание типа на union и т.п. ибо в 23++ ввели start_lifetime читать где-то от сюда: https://t.me/ProCxx/514377

Stas Koynov
недавно обсуждали это дело после анонса 23++. это ...

Нет. type punning и разыменование произвольного указателя - не одно и то же: лишь первое явно обозначено в Стандарте как UB

volatile не забудь

а с memory mapped devices как прикажешь разработчикам на МК или голом железе работать?

кстати напиши volatile int

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта