У тебя есть кусок данных, ты берешь из него 4х байтное число. Это не только не УБ, но вообще обычное дело в сях - встречается сплошь и рядом. Вот представь, тебе надо прочитать бинарные данные из файла в некую структуру, а read/fread вообще не в курсе ни о каких типах.
Ну ок. Говорю же, не уверен был. Я в подобном коде выравнивал буфер по PAGE_SIZE, а в user space уже производил побайтовую конверсию (по типу как в ntoh, hton), а не как ТС хочет. Поэтому с подобными проблемами не сталкивался.
Си - это кроссплатформенный ассемблер. Всё дозволено. Вся ответственность перекладывается на кодера. Если вопрос в том, можно ли так делать, то ответ однозначен - можно.
Причем можно делать вещи и похуже. Вдруг у автора кода задача - вызвать падение. Или заложить бекдор. Или это часть эксплоита. Или его это просто прикалывает.
7 An object shall have its stored value accessed only by an lvalue expression that has one of
the following types: 88)
— a type compatible with the effective type of the object,
— a qualified version of a type compatible with the effective type of the object,
— a type that is the signed or unsigned type corresponding to the effective type of the
object,
— a type that is the signed or unsigned type corresponding to a qualified version of the
effective type of the object,
— an aggregate or union type that includes one of the aforementioned types among its
members (including, recursively, a member of a subaggregate or contained union), or
— a character type.
Давно интересует вопрос: а какое место в стандарте гарантирует, что после копирования байтов в объект с использованием memcpy этот объект будет содержать значение, являющееся интерпретацией этих байтов как представления соответствующего типа?
#include <iostream>
struct A {
char a, b;
void print() const {
std::cout << "a = " << a << ", b = " << b << std::endl;
}
};
int main() {
reinterpret_cast<const A *>("12345")->print();
}