Size: a a a

Programming Offtop

2020 March 20

Д

Декар in Programming Offtop
Alexander Nozik
Ну да, но все равно, если кто-то где-то поменяет структуру класса/структуры, оно не просто ляжет, а будет генерить ерунду
А если эта структура принадлежит не только твоему приложению, будет то же самое. Ты не сможешь от этого уйти никогда.
источник

Д

Декар in Programming Offtop
Яркий пример - пакет данных от устройства в ПК
источник

AN

Alexander Nozik in Programming Offtop
Декар
А если эта структура принадлежит не только твоему приложению, будет то же самое. Ты не сможешь от этого уйти никогда.
Могу. Я работаю с байтовым блоком и генерирую для него статические аксессоры. Кучу раз это делал. С точки зрения рантайма это просто байтовый блок с доступом по смещению, но с точки зрения кода он безопасный
источник

AN

Alexander Nozik in Programming Offtop
Декар
Яркий пример - пакет данных от устройства в ПК
Вот кучу раз это делал
источник

Д

Декар in Programming Offtop
Alexander Nozik
Могу. Я работаю с байтовым блоком и генерирую для него статические аксессоры. Кучу раз это делал. С точки зрения рантайма это просто байтовый блок с доступом по смещению, но с точки зрения кода он безопасный
А завтра я добавлю ещё пару байт данных, которые передаёт твой магнитометр в начало пакета. И твой байтовый блок развалится, но ты этого не заметишь
источник

AN

Alexander Nozik in Programming Offtop
Просто если ты итерпретируешь байтовый блок как структуру, у тебя куча неопределенностей -  порядок байтов, размер интов, нестабильность АПИ и так далее. Если ты все это заворачиваешь в интерпретацию явно, то ты от этого защищаешься
источник

AN

Alexander Nozik in Programming Offtop
Декар
А завтра я добавлю ещё пару байт данных, которые передаёт твой магнитометр в начало пакета. И твой байтовый блок развалится, но ты этого не заметишь
А структура твоя не развалится? Она не просто развалится, она мусор будет в поля пихать
источник

Д

Декар in Programming Offtop
Alexander Nozik
Просто если ты итерпретируешь байтовый блок как структуру, у тебя куча неопределенностей -  порядок байтов, размер интов, нестабильность АПИ и так далее. Если ты все это заворачиваешь в интерпретацию явно, то ты от этого защищаешься
А если как структуру его итнтерпретируют в Калифорнии, а тебе только присылают?
источник

AN

Alexander Nozik in Programming Offtop
Декар
А если как структуру его итнтерпретируют в Калифорнии, а тебе только присылают?
А где гарантия, что у тебя и в калифорнии одинаковая структура?
источник

VP

Vladimir Petrakovich in Programming Offtop
Alexander Nozik
Просто если ты итерпретируешь байтовый блок как структуру, у тебя куча неопределенностей -  порядок байтов, размер интов, нестабильность АПИ и так далее. Если ты все это заворачиваешь в интерпретацию явно, то ты от этого защищаешься
Выглядит одинаково, что структура, что реализованное то же самое в либе. Просто вот эти особенности надо учитывать. Не знаю, как там в C (один ABI на платформу?), но в языках, которые с ним интеропятся, вроде обычно раскидывают аннотации с описанием таких параметров.
источник

AN

Alexander Nozik in Programming Offtop
Все протоколы обмена данными, основанные на языковых структурах вымерли один за другим именно по этой причине. Неявная языко-зависимая схема работает только на монолите, поддержка которого превращается в тыкву через 2 года. В ЦЕРН руте ровно то же самое - прямая серизация структур в коде. В результате этот формат надо выкидывать, поскольку его никто кроме рута не может прочитать, а сам рут ломает совместимость каждый первый раз
источник

AN

Alexander Nozik in Programming Offtop
Vladimir Petrakovich
Выглядит одинаково, что структура, что реализованное то же самое в либе. Просто вот эти особенности надо учитывать. Не знаю, как там в C (один ABI на платформу?), но в языках, которые с ним интеропятся, вроде обычно раскидывают аннотации с описанием таких параметров.
Разница довольно сильная. Она в том, что сериализатор поменять - это явное дейсвтие. Надо менять схему и спецификацию.  А поле в структуру могут добавить "случайно", а уж тем более местами поменять.
источник

VP

Vladimir Petrakovich in Programming Offtop
Alexander Nozik
Все протоколы обмена данными, основанные на языковых структурах вымерли один за другим именно по этой причине. Неявная языко-зависимая схема работает только на монолите, поддержка которого превращается в тыкву через 2 года. В ЦЕРН руте ровно то же самое - прямая серизация структур в коде. В результате этот формат надо выкидывать, поскольку его никто кроме рута не может прочитать, а сам рут ломает совместимость каждый первый раз
А разве layout структур не специфицирован и может меняться сам по себе?
источник

AN

Alexander Nozik in Programming Offtop
Vladimir Petrakovich
А разве layout структур не специфицирован и может меняться сам по себе?
В С теоретически специфицирован, в С++ насколько я помню уже нет. Но весь многолетний опыт показывает, что даже если специфицирован, то ошибок возникает в море. Котлин не зря от java serialization отказалась
источник

AM

Andrew Mikhaylov in Programming Offtop
Vladimir Petrakovich
А разве layout структур не специфицирован и может меняться сам по себе?
Может, если, у примеру, не фиксировать выравнивания между полями.
источник

VP

Vladimir Petrakovich in Programming Offtop
Alexander Nozik
Разница довольно сильная. Она в том, что сериализатор поменять - это явное дейсвтие. Надо менять схему и спецификацию.  А поле в структуру могут добавить "случайно", а уж тем более местами поменять.
Надо просто относиться к таким структурам как к публичному ABI. То, что их не надо отмечать явным образом - это да, плохо.
источник

VP

Vladimir Petrakovich in Programming Offtop
В джаве с рефлективными сериализаторами в JSON и прочее ровно такая же ситуация
источник

AN

Alexander Nozik in Programming Offtop
Vladimir Petrakovich
Надо просто относиться к таким структурам как к публичному ABI. То, что их не надо отмечать явным образом - это да, плохо.
Ну в С по-другому нельзя. Тут никто не спорит. Но в современных языках все-таки не надо так делать. Кроме того, речь шла о кастах. Каст подразумевает, что ты не просто что-то вычитал, а еще и куда-то превращаешь. Два места, где можно напороться
источник

VP

Vladimir Petrakovich in Programming Offtop
Alexander Nozik
Ну в С по-другому нельзя. Тут никто не спорит. Но в современных языках все-таки не надо так делать. Кроме того, речь шла о кастах. Каст подразумевает, что ты не просто что-то вычитал, а еще и куда-то превращаешь. Два места, где можно напороться
Ну начало беседы я пропустил, но свелось всё, как я понял, к тому, что натягивать байты на юзабельные сущности путём каста к структуре - это очень опасно
источник

AN

Alexander Nozik in Programming Offtop
Декар
А чем они хуже *reinterpret_cast<volatile uint32_t *>(0x40010000) = (1U << 5U) ;
Началось с этого
источник