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

Нет ли тут какой-нибудь подлянки из-за того, что мы тасуем

байты внутри живого объекта?

59 ответов

45 просмотров

Единственное, я бы оперировал unsigned char, вместо uint8_t

Дмитро Цимбалюк
Почему так?

По определению strict aliasing https://en.cppreference.com/w/c/language/object

Есть: этого нельзя делать в настоящий момент.

Sergey Anisimov
См. [p1839].

P1839R0: Accessing Object Representations (by Krystian Stasiowski) (2019-08-09) (Related: GitHub issue) P1839R1: Accessing Object Representations (by Krystian Stasiowski) (2019-10-02) (Related: GitHub issue) P1839R2: Accessing Object Representations (by Krystian Stasiowski) (2019-11-20) (Related: GitHub issue) P1839R3: Accessing Object Representations (by Krystian Stasiowski, Timur Doumler) (2022-02-19) (Related: GitHub issue) P1839R4: Accessing Object Representations (by Krystian Stasiowski, Timur Doumler) (2022-03-16) (Related: GitHub issue) P1839R5: Accessing object representations (by Timur Doumler, Krystian Stasiowski) (2022-06-17) (Related: GitHub issue)

d7d1cd- Автор вопроса
Sergey Anisimov
Есть: этого нельзя делать в настоящий момент.

То есть, тасовать байты нельзя, а заполнить uint32_t через memset можно? uint32_t data = 0; memset(&data, 0x42, sizeof(data));

d7d1cd
То есть, тасовать байты нельзя, а заполнить uint32...

Заполнение через memset() - серая зона. Можно считать, полагаю, что это исключение для стандартной библиотеки. Сишное наследие слабо покрывается крестовым нормативом, обычно там просто пишут, что "контракты такие же, как в C", с пренебрежением к тому, что модели различаются.

d7d1cd- Автор вопроса
d7d1cd- Автор вопроса
Sergey Anisimov
Да.

А как тогда поменять местами байты внутри uint32_t?

d7d1cd- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
ручками

Вы историю вопроса читали вообще?

d7d1cd
Вы историю вопроса читали вообще?

Потенциально можете создать новый объект с таким значением.

d7d1cd- Автор вопроса
Sergey Anisimov
Потенциально можете создать новый объект с таким з...

Так а значение как получить? Ведь мне исходные данные в рантайме придут

d7d1cd
Так а значение как получить? Ведь мне исходные дан...

as_bytes можно попробовать, опять же, полагаясь на библиотечное исключение. Что примечательно, нормативное описание этих примитивов по сути означает, что осмысленно пользоваться ими нельзя. Надо бы посмотреть issue по этому поводу, наверное...

d7d1cd
Так а значение как получить? Ведь мне исходные дан...

это нужно делать аккуратно, идеально покрыть тестами, чтобы код работал как ты это задумал. А так, тут запрета нет, как обрабатывать биты, хоть массив, хоть каст в структуру, хоть onion, портянка из сдвигов

d7d1cd
А как тогда поменять местами байты внутри uint32_t...

Написать менялку через сдвиги и &, компилятор поймет и сделает все, что нужно, коротким путем.

d7d1cd- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
это нужно делать аккуратно, идеально покрыть теста...

В этом примере все аккуратно. Все тесты проходят. Однако это UB 😂

d7d1cd- Автор вопроса
Sergey Anisimov
См. [p1839].

Не понял из документа следующий момент в этом примере: using T = unsigned char*; int a = 0; T b = reinterpret_cast<T>(&a); // Pointer value unchanged, still // points to the int object T c = ++b; // UB, expression type differs // from element type Почему здесь UB? Мы сказали, что b - это указатель на unsigned char. Далее мы его инкрементим и его значение присваиваем другой переменной того же типа. Почему UB?

d7d1cd
Не понял из документа следующий момент в этом прим...

Выполняя реинтерпретацию мы всего лишь подправляем тип выражения: сам указатель от этого указывать на a не перестает - это тема provenance'ов и, в частности, std::launder() как раз.

d7d1cd
А как тогда поменять местами байты внутри uint32_t...

Макросами или constexpr, чтобы делегировать подтасовку на preprocessing-time/compile-time

d7d1cd
В этом примере все аккуратно. Все тесты проходят. ...

https://godbolt.org/z/h3b48TsKc вот, прячешь функцию в какой нибудь хидер и никто не заметит что ты ниггадяй, а главное ноги твоей функцией не отстрелит

Sergey Anisimov
Выполняя реинтерпретацию мы всего лишь подправляем...

в том примере даже не разыменовывается ничего выражение T c = ++b; где b и c это указатели типа T, по-моему всегда валидно, пока ++b не заходит за past-the-end

d7d1cd
В этом примере все аккуратно. Все тесты проходят. ...

https://godbolt.org/z/4jT5Ms4s8 вот, в точке вызова никто твои магические упражнения и не заметит

d7d1cd- Автор вопроса
d7d1cd
А компилятор? 😂

а тут ты главный, чего, боишься компилятора? Ну можешь копировать побайтово сдвигом и делать без каста, но и тут компилятор не ругается, все хорошо

d7d1cd- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
а тут ты главный, чего, боишься компилятора? Ну мо...

После приведенных документов выглядит как наброс на вентилятор и троллинг

Vlad
в том примере даже не разыменовывается ничего выр...

> не заходит за past-the-end Но past-the-end чего?) Резюмирую пример: int i{}; reinterpret_cast<byte*>(&i) + 1; Этого уже достаточно для неопределенного поведения по определению арифметики указателей (нет подлежащего массива). Поскольку e[i] == *(e + i), с индексацией такая же проблема.

d7d1cd
После приведенных документов выглядит как наброс н...

не увидел документов касающихся типа int и его производных

Sergey Anisimov
> не заходит за past-the-end Но past-the-end чего?...

вы упускаете http://eel.is/c++draft/basic.compound#3.sentence-12

Vlad
вы упускаете http://eel.is/c++draft/basic.compound...

Уточните, что считаете релевантным там. По моим представлениям оно всего лишь про: T a[n] -> T a[n + 1]; T a -> T a[2]; (где последний элемент "гипотетический" и получать доступ к нему нельзя - только сравнивать и перемещаться)

Vlad
вы упускаете http://eel.is/c++draft/basic.compound...

А, хотя я понял, кажется, Вашу мысль здесь: Вы имеете в виду, что int i; reinterpret_cast<byte*>(&i) + 1 /* #1 */; как раз должно быть можно и в #1 результат должен указывать на past-the-end для int исключительно за счет того, что прибавляется именно единица? =) Да, формально Вы должны быть правы, в таком случае, но думаю, что это - очередная дыра в себе (поскольку адресно результат будет другим: расчет ведь по ct-типу).

Sergey Anisimov
Уточните, что считаете релевантным там. По моим пр...

так речь не о гипотетическом типе T, а о uint32_t, устройство которого нам достоверно известно. Тогда и char[] - это уб, ну мы же МОЖЕМ выйти за пределы массива

Sergey Anisimov
А, хотя я понял, кажется, Вашу мысль здесь: Вы име...

скорее всего я не прав, потому что как вы правильно заметили, формально там нет не то что массива, и но и объекта типа unsigned char

Aniki Hi$ok@ 🌈 Z 🐀
так речь не о гипотетическом типе T, а о uint32_t,...

Вы, вероятно, упускаете суть беседы. Уточните, что именно не понимаете и в чем видите здесь аналогию с char[].

d7d1cd
В этом примере все аккуратно. Все тесты проходят. ...

Главный вопрос - а нафига вручную reverse писать, есть же готовые функции.

Vlad
скорее всего я не прав, потому что как вы правильн...

Ну цитируемое должно быть справедливо, но составлять issue смысла не вижу: такие противоречия, как я понял, признаются и обрабатываются неохотно, особенно с учетом того, что с принятием 1839 (которое пока не предвидится, как я понимаю), смысл оно вовсе потеряет скорее всего.

d7d1cd- Автор вопроса
Sergey Anisimov
Есть: этого нельзя делать в настоящий момент.

Sergey, касательно этого Вашего ответа. Как описано в моем изначальном примере делать нельзя, это UB. Я переписал функцию reverse. Скажите, теперь в ней есть UB?

d7d1cd- Автор вопроса
Aleksander Spichak
ub

А где именно?

d7d1cd
А где именно?

На моменте memcpy последнего

d7d1cd- Автор вопроса
Aleksander Spichak
На моменте memcpy последнего

Вот тут: std::memcpy(&value, buff, size); ?

d7d1cd- Автор вопроса

Так, опять поломка старых знаний... Вроде как заполнять объект через memcpy можно. Тем более тривиальный тип.

d7d1cd- Автор вопроса

А если ограничить тривиальными?

d7d1cd
А если ограничить тривиальными?

я бы сказал только фундаментальными типами

d7d1cd
А если ограничить тривиальными?

Вопрос - а зачем именно через временный буфер, хочется "универсальности" ?

d7d1cd- Автор вопроса
d7d1cd
А как без него?

Битовые операции

d7d1cd- Автор вопроса
Aleksander Spichak
Битовые операции

Код будет гораздо сложнее тогда.

d7d1cd- Автор вопроса
Александр Водянников
И ???

Так а зачем, если приведенный более понятен, делает то же самое и в нем нет ub?

d7d1cd
Так, опять поломка старых знаний... Вроде как запо...

В отношении memcpy() есть всего два специальных разрешения (1, 2), которые относятся к Вашему примеру и все-таки не покрывают. В остальном, норматив ссылается на С-стандарт, который на настоящий момент описывает memcpy() так: > The memcpy function copies n characters from the object pointed to by s2 into the object pointed to by s1. If copying takes place between objects that overlap, the behavior is undefined. Как это транслируется в крестовую объектную модель - shrug: по моему представлению, в этом отношении объектная модель underspecified.

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
думаешь я не смогу также сделать? мне это просто не удобно
int 💳 𝙖𝙞𝙧 𝙗𝙞𝙜 𝙗𝙤𝙗 🔫 check bio / spam block / AFK / nohello.com / GMT+3
9
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
3
Есть ли смысл устраиваться на 1с ? Даст это плюс в дальнейшем трудоустройстве на php? Просто у меня в городе вакансий на пхп нету. Или лучше удаленно искать. Опыта работы нету...
Azamat
14
hi im a cs student. i need some advice from people who have enough experience in Embedded Software. I need to know whether this profession is suitable for me. I have watched s...
Sahand 🏔️
8
Карта сайта