Является ли это не определенное поведение для константного представления неконфессионального розетки, полученного байтовC++

Программы на C++. Форум разработчиков
Anonymous
Является ли это не определенное поведение для константного представления неконфессионального розетки, полученного байтов

Сообщение Anonymous »

У меня есть код, который получает (не консервные) байты UDP через recv () системный вызов. Байтовый буфер затем передается в код на уровне бизнеса, который считывает байты, делая что-то вроде: < /p>

Код: Выделить всё

const auto* msg = reinterpret_cast(buffer); // BusinessMessage is a packed struct corresponding exactly to the bytes sent by the sender
... through some framework code so I'm forced to keep the msg as const...
DoBusinessLogic(msg->GetField1(), msg->GetField2(), ...);
Примечание: этот вид reinterpret_cast в основном везде в коде и проверяется в результате битвы в течение более десяти лет, хотя я знаю, что некоторые пуристы могут поднять возражения. Допустим, Field2 должен быть изменен на какое -то другое значение. Как правило, правильный способ сделать это - использовать изменчивую переменную члена. Я не могу этого сделать из -за ограничений структуры (см. Пример кода ниже). Поэтому я делаю это, добавив функцию «const» в BusinessMessage , которая фактически мутает Field2. Что -то вроде этого: < /p>
struct BusinessMessage : Field1, Field2, ... // sadly, I cannot change this impl so as to allow mutable member variables.
{
void NonConstSetField2(int value) const
{
const Field2* field = static_cast(this);
Field2* mutableField = const_cast(field);
mutableField->Set(value);
}
};
< /code>
Я проверил это под UB-санитизатором, и он не жалуется. < /p>
Коллега говорит, что это UB. Я не уверен, он может ошибаться, но я не знаю окончательно, если я прав. Это UB в соответствии со стандартом? Будет ли это безопасно с современным (например,> = 12) компилятором GCC, даже если он технически UB?

Подробнее здесь: https://stackoverflow.com/questions/796 ... cket-recei

Вернуться в «C++»