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

Написал несколько своих функция для I/O (для файла и сокета).

Из них я получаю std::span<const std::byte>. Правильно ли использовать std::byte только для того, чтобы потом сделать над std::byte* reinterpret_cast<const my_struct*>? Как это с алиасингом работает (вроде именно из-за него придумали std::byte вместо uint8_t)?

23 ответов

23 просмотра

Reinterpret тут не избавит от ub

LaG1924- Автор вопроса
LaG1924- Автор вопроса
LaG1924- Автор вопроса
LaG1924
Ладно. Какое здесь UB?

Я читаю через асинхронный WinApi во временный буффер std::vector<std::byte>. Функция чтения из сокета/файла возвращает std::span<const std::byte> на этот буффер. Потом я его кастую через reinterpret_cast к своей POD-структуре (несколько int'ов, потом 255 char'ов, и т.д.) у которой выключено выравнивание. Где здесь может быть UB и сгенерирует ли компилятор оптимальный код с учетом алиасинга std::byte?

LaG1924
Ладно. Какое здесь UB?

https://en.cppreference.com/w/cpp/language/reinterpret_cast Performing a class member access that designates a non-static data member or a non-static member function on a glvalue that does not actually designate an object of the appropriate type - such as one obtained through a reinterpret_cast - results in undefined behavior

LaG1924- Автор вопроса
Alexander Petrov
https://en.cppreference.com/w/cpp/language/reinter...

В моей ситуации как понять, что я указываю на не-объект? С учетом того, что она тривиально копируется, создается и уничтожается.

LaG1924
В моей ситуации как понять, что я указываю на не-о...

When it is needed to interpret the bytes of an object as a value of a different type, std::memcpy or std::bit_cast (since C++20)can be used

LaG1924- Автор вопроса
Alexander Petrov
When it is needed to interpret the bytes of an obj...

То есть в C++20 вместо reinterpret_cast надо использовать std::bit_cast, правильно?

LaG1924- Автор вопроса
Kelbon
это везде так нужно делатьт

До C++20 вроде нет std::bit_cast

LaG1924
Я читаю через асинхронный WinApi во временный буфф...

С двадцатого стандарта можно. Здесь как-то спрашивал со ссылкой на утвердившее новые правила предложение (если желаете разобраться).

LaG1924
Я читаю через асинхронный WinApi во временный буфф...

В случае вектора мне не так очевиден ответ. Я помню гарантии на локальные массивы, malloc и new. Но наверное, можно сказать что нам известен эффект дефолтного аллокатора, который обязан вызвать new и таким образом правило неявного создания объектов сработает.

magras
В случае вектора мне не так очевиден ответ. Я помн...

Хотя стоп, вектор же не может создать массив байт. Он их создает по одному. Кажется опять все разваливается.

magras
В случае вектора мне не так очевиден ответ. Я помн...

Стандартный аллокатор гарантированно начинает лайфтайм массива, после чего применяется упомянутое правило о лайфтайме массивов ord-char-type/std::byte.

Sergey Anisimov
Стандартный аллокатор гарантированно начинает лайф...

Кажется я перестал понимать текущую модель памяти плюсов. Спасибо за ссылку.

magras
Кажется я перестал понимать текущую модель памяти ...

Все эти нововведения проистекают из [p0593r6] и ретроактивно возвращают миллионам и миллионам строк кода статус C++--программ позволяют zero-overhead десериализацию.

Sergey Anisimov
Все эти нововведения проистекают из [p0593r6] и ре...

P0593R6: Implicit creation of objects for low-level object manipulation (by Richard Smith, Ville Voutilainen) (2020-02-14) (Related: GitHub issue)

Sergey Anisimov
Все эти нововведения проистекают из [p0593r6] и ре...

Для чего это задумывалось я понимаю. Но формулировка создает array object, не создавая элементы массива меня вводит в ступор. Видимо придется еще раз перечитать пропозал.

Может, сразу читать в вектор структур?

LaG1924- Автор вопроса
Dmitriy [Отпуск]
Может, сразу читать в вектор структур?

Этот код читает разные структуры. Которые, в зависимости от некоторого заголовка (который тоже структура, да) могут вызывать дальнейшее чтение разных структур. А ещё я сомневаюсь, что OVERLAPPED структура (асинхронный ввод/вывод в винде) начинает лайфтайм (это вроде просто запись в буффер в памяти по указанному адресу из ядра).

LaG1924
Этот код читает разные структуры. Которые, в завис...

Формально говоря, в данном случае 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
Карта сайта