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

Привет. Есть вот такой код. void foo(float f) { auto*

buf = reinterpret_cast<unsigned char*>(&f);
for (int i = 0; i < sizeof(f); ++i)
std::cout << buf[i];
}
Вроде как тут уб, потому что я кастую не к массиву чаров, а к одному чару, и потому обращение к последующим некорректно.
Но на cppreference есть такие моменты:

https://en.cppreference.com/w/cpp/language/object
For an object of type T, object representation is the sequence of sizeof(T) objects of type unsigned char (or, equivalently, std::byte) beginning at the same address as the T object.

https://en.cppreference.com/w/cpp/language/reinterpret_cast
Whenever an attempt is made to read or modify the stored value of an object of type DynamicType through a glvalue of type AliasedType, the behavior is undefined unless one of the following is true:
...
AliasedType is std::byte, (since C++17) char, or unsigned char: this permits examination of the object representation of any object as an array of bytes.

То есть как будто всё валидно на самом деле.
Однако есть такой proposal:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1839r2.pdf
Если всё правильно, то что он хочет решать? В нём можно найти такой текст:
This has only recently become undefined behavior as of C++17, when [P0137R1] was accepted. This proposal
includes a change to how pointers work, notably that they point to objects, rather than just representing an
address, and it seems that the proposal neglected to add any provisions to allow access to the object representation
of an object.
Может код валиден в прошлых версиях, но просто в стандарт случайно посадили багу, которую он и хочет закрыть?
Почему тогда на cppreference инфа не согласуется с инфой в нём (и соответственно в стандарте)?

5 ответов

17 просмотров

Кастовать к чару можно

> не к массиву чаров, а к одному чару, и потому обращение к последующим некорректно. Чёт вроде нет такого

все хорошо. вы по одному читаете байты представления объекта http://eel.is/c++draft/basic.lval#11.3

Vanya-Khodor Автор вопроса
Vlad
все хорошо. вы по одному читаете байты представлен...

Я повторюсь, но тогда непонятно, зачем нужно предложение с исправлением()

Указатель на массив типа и указатель просто на тип - это один и тот же указатель, никакого UB тут нет, кроме того, указатель на char особый случай, он всегда разрешён, не UB.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
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
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта