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

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

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

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

*((int*)0xDEADBEEF) = 1

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

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

19 ответов

22 просмотра

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

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта