
Pepe
05.10.2018
06:46:56

Andrew
05.10.2018
06:48:23
#pragma pack() тадам
Во, я думал, предложит ли кто-то это говно. Теперь по всему коду будет хуже работа со структурой, но можно бездумно делать memcpy, каааайф.

Pepe
05.10.2018
06:49:40

Ilia
05.10.2018
06:56:56

Google

Andrew
05.10.2018
06:57:51

Vladislav
05.10.2018
07:01:32

Rabu
05.10.2018
07:25:40
__attribute__((aligned32))

Vladislav
05.10.2018
07:26:34
а какое оно имеет отношение к паддингу?

Rabu
05.10.2018
07:27:01
так align жеж

Aidar
05.10.2018
07:27:17

Побитый
05.10.2018
07:32:28

Andrew
05.10.2018
07:33:55
Это было, правда, про неинициализированную.

Побитый
05.10.2018
07:35:01

Anatoly
05.10.2018
07:35:47

Andrew
05.10.2018
07:35:50

Google

Побитый
05.10.2018
07:36:30
А, понял теперь. Просто с первого раза какой-то парадокс показался)

Pepe
05.10.2018
08:02:24

Andrew
05.10.2018
08:04:31

Pepe
05.10.2018
08:06:56

Andrew
05.10.2018
08:09:35
Ну, если ты выделил локальный массив и сразу из него читаешь, то все немного очевидно. В случае с паддингом, на самом деле, тоже можно отслеживать, при желании.
Да и вообще, кажется, при компиляции достаточно иметь пометку, что в память пока никто не писал, и на нее орентироваться.

Pepe
05.10.2018
08:12:19

Andrew
05.10.2018
08:21:07
Зависит от компилятора? Через 10 лет еще поумнеют, и твой код станет валиться из-за УБ.
Не надо так.

yuri
05.10.2018
08:32:41

Zorro
05.10.2018
08:37:42

Basil
05.10.2018
09:08:25

Andrew
05.10.2018
09:10:39

Basil
05.10.2018
09:17:18
не всегда лень. просто не везде памяти 100500Мб. при 8к ОЗУ и не так раскорячишься.

Andrew
05.10.2018
09:25:13
А, не, ну это совсем другая история.

Anton
05.10.2018
09:26:58

Constantine
05.10.2018
09:55:40
я, кажется, даже слышал где-то этот фокус с полной выгрузкой всей памяти и последующим изучением PageFault, но не помню, где

Ilia
05.10.2018
10:15:49

Andrew
05.10.2018
10:16:44

Google

Ilia
05.10.2018
10:16:52

Andrew
05.10.2018
10:17:47

Ilia
05.10.2018
10:22:11
Компилятор видит memcpy, он не вкурсе, что там дальше будет. Я не уверен, что он будет париться, хороший ли у тебя uninitialized read или плохой.
Пагади, ты что -то запутался...
Шаг 0) мы объявляем структуру в какой -то памяти. Там есть паддинги. Мы их не ипользуем.
Шаг 1) Мы заполняем нужные мемберы нужными данными . Паддинги не используются.
Шаг 2) мы записываем бинарный образ структуры на диск.
Паддинги записываются.
Шаг 3) В новом экземпляре программы мы создаём новый экземпляр структуры.
Шаг 4) Читаем бинарный образ структуры с диска. Члены читаются, заполняются. Паддинги тоже заполняются.
Шаг 5) идёт нормальная работа программы. Члены структуры с соотв. данными используются, Паддинги не используются.
В чём проблема?

Andrew
05.10.2018
10:23:13
в шаге 2 ты читаешь паддинги, я утверждаю, что это uninitialized read

Ilia
05.10.2018
10:23:46

Andrew
05.10.2018
10:24:14
И что? Если я не использую результат UB, он перестает быть UB? Это не так работает.

Ilia
05.10.2018
10:25:24

Andrew
05.10.2018
10:26:02
Если существует ветвь выполнения, при которой я прочту непроинициализированную память, то да.

Ilia
05.10.2018
10:27:09

Andrew
05.10.2018
10:27:53
Из твоего описания это неочевидно. Если указанное мной условие невыполняется, то УБ нет. И?

Ilia
05.10.2018
10:28:21

Andrew
05.10.2018
10:28:55
Нет же, mem(cpy/set/cmp) дойдет и до паддингов.

Ilia
05.10.2018
10:29:22

Дмитрий
05.10.2018
10:29:32
Какая к черту разница что ты делаешь с неинициализированным массивов байтиков
Куда копируешь твоё дело
Читать неинициализированное число не UB

Andrew
05.10.2018
10:30:47
А с какого тут ещё и memcpy?
Ты вообще помнишь, о чем разговор? Человеку посоветовали структуру сохранять в файл через memset на mmap (на самом деле, fwrite(to, &foo, sizeof(foo)) тут не лучше).

Ilia
05.10.2018
10:33:05

Google

Andrew
05.10.2018
10:42:58

Ilia
05.10.2018
10:45:38

Constantine
05.10.2018
10:51:20

Ilia
05.10.2018
10:51:42

Alexander
05.10.2018
10:52:38
Пример не очень. У вас в зависимости что где эта переменная она будет или нет инициализирована неявно. При этом есть напирающие на UB

Constantine
05.10.2018
10:53:09
А, наверное, их можно читать только в байтовом представлении. Сложно.

Antony
05.10.2018
10:55:10
Андей, попробуй найти место стандарта, где написано, что это UB.
Я вот не уверен в этом совсем.
Даже наоборот, уверен, что UB тут нет.
А про то, что memcpy неинициализированного это не UB, тебе уже писали.
Вроде оно:
When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if
no initialization is performed for the object, that object retains an indeterminate value until that value
is replaced (7.6.18). If an indeterminate value is produced by an evaluation, the behavior is undefined except in the
following cases <...>
[dcl.init]
http://eel.is/c++draft/dcl.init#12

Ilia
05.10.2018
10:56:45

Antony
05.10.2018
10:57:07
Внизу прям пример есть

Ilia
05.10.2018
10:57:11

Alex Фэils?︙
05.10.2018
10:57:59
А мемсру просто тупо копирует

Antony
05.10.2018
10:58:06

Constantine
05.10.2018
10:58:13
О! Я тут как раз недавно набрасывал как идею, чем может сломаться
[] (bool b, auto&& value) -> std::optional { /*auto -> шаблонное имя; все выполнившиеся deduction guide должны вернуть одно и то же, первый выполнившийся дает ответ*/
if (!b) return std::nullopt; /*вроде здесь нет подходящего*/
return std::forward<decltype(value)>(value); /*а вот тут есть*/
}

Ilia
05.10.2018
10:59:26
А как выглядит пример полностью? А то я скорее отвечал на ^
Ну примера нет.
Обсуждаем создание в любой памяти структуры с паддингом (выравниванием членов) и последующей её записью на диск через write, затем чтение через read и использование в программе.
И потом то же, но с копированием всего это в Mem-mapped область.

Andrew
05.10.2018
10:59:37
Претензия была к паддингам

Ilia
05.10.2018
11:01:16

Google

Aidar
05.10.2018
11:03:46
кусок паддинга эт не то

Andrew
05.10.2018
11:05:02
Согласен.

Ilia
05.10.2018
11:07:08
Согласен.
Ну а я тебе про что говорил всё это время?