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 ответов

20 просмотров

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

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

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

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта