У меня есть некоторые фрагменты кода на C ++, которые при запуске на Xcode с включенным в Undefined Behavior Sanitizer отчетами: «runtime error: store to misaligned address 0x7f8bcc403771 for type 'int', which requires 4 byte alignment
».
Итак, я создал небольшой тестовый пример Catch2 для воспроизведения кода. Мне нужно проверить поведение во время выполнения на windows / x64 (MSVC) и Mac (Xcode 11 / clang), но все работает, как и ожидалось, даже при компиляции сразличные типы оптимизаций (-O2, -O3, -Ofast и т. д.).
Код, о котором идет речь (код теста Catch2):
TEST_CASE("misaligned_write", "[demo]") {
unsigned char *data = (unsigned char*)malloc(20);
memset(data, 0, 20);
int *ptr = reinterpret_cast<int*>(&data[1]);
*ptr = 0x11223344; // undefined behaviour triggered
CHECK(static_cast<uint8_t>(data[1]) == 0x44);
CHECK(static_cast<uint8_t>(data[2]) == 0x33);
CHECK(static_cast<uint8_t>(data[3]) == 0x22);
CHECK(static_cast<uint8_t>(data[4]) == 0x11);
}
Итак, мой вопрос:это неопределенное поведение, ложное срабатывание или что-то в коде может сломаться в будущем из-за некоторых изменений флагов компилятора по умолчанию?