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

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

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

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

*((int*)0xDEADBEEF) = 1

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

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

19 ответов

23 просмотра

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

Если мне не изменяет память станларт оговаривает только *((*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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта