и оно мапит свой, ну, скажем, регистр на адрес 0xDEADBEEF.
Соответственно, когда в программе я пытаюсь написать
*((int*)0xDEADBEEF) = 1
Я записываю единичку не в RAM, а в регистр этого оборудования.
Вопрос: насколько валидно с точки зрения стандарта С++ выглядит попытка записать значение по адресу, по которому как бы нет проинициализированного объекта. Это UB или не UB?
Это серая зона. В стандарте (коллеги поправят, если я ошибаюсь) подобные операции оговорены примерно никак.
Если мне не изменяет память станларт оговаривает только *((*int)0x1) = 1; int a = *((*int)0x1); // a == 1
Для общего случая разрешений нет. Маппинг чисел в указатели - IDB, но доступ в объект вне лайфтайма (int в этом случае) - неопределенное поведение. Можно положиться на гарантии конкретной имплементации, но код перестанет быть стандартным, разумеется. @pavel_zhigulin
volatile не забудьте, а то компилятор оптимизирует это
доступ в объект вне лайфтайма А кто сказал, что вне?) Указатель-то "внешний", и доказать (а благодаря volatile - и оптимизировать) компилятор ничего не сможет...
С т.з. абстрактной машины - вне. Порядок создания объектов строго оговорен. Опять же, закладываться на гарантии имплементации (вернее - конформным имплементациям их предоставлять) разрешается, но только так.
Как-будто есть какие-то варианты...
Да-да, с т.з. абстрактной машины внешнего кода вообще не существует)
Пользоваться гарантиями имплементации, опять же. Фигурировало еще предложение "отмывать" адреса через внешние зависимости на языках без подобного понятия лайфтаймов (ASM, например).
Гм, а есть актуальный драфт C в свободном доступе? Емнип, совсем по случайным адресам все еще нельзя было...
Это 100% UB.
Нет, это UB, поскольку по этому адресу никто никогда не создавал объект типа int.
недавно обсуждали это дело после анонса 23++. это как раз вопрос про лайф тайм, про смешивание типа на union и т.п. ибо в 23++ ввели start_lifetime читать где-то от сюда: https://t.me/ProCxx/514377
Нет. type punning и разыменование произвольного указателя - не одно и то же: лишь первое явно обозначено в Стандарте как UB
volatile не забудь
а с memory mapped devices как прикажешь разработчикам на МК или голом железе работать?
кстати напиши volatile int
Обсуждают сегодня