Неопределенное поведение или ложное срабатывание - PullRequest
0 голосов
/ 16 октября 2019

У меня есть некоторые фрагменты кода на 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);
}

Итак, мой вопрос:это неопределенное поведение, ложное срабатывание или что-то в коде может сломаться в будущем из-за некоторых изменений флагов компилятора по умолчанию?

1 Ответ

1 голос
/ 16 октября 2019

malloc() всегда возвращает указатель, который выровнен соответствующим образом для любого возможного типа данных. &data[1] - указатель на второй байт этого, который, очевидно, не выровнен правильно для любого типа данных, который имеет требование выравнивания > 1. Используйте &data[0] или &data, если вы хотите, чтобы указатель находился в первых четырех байтах памяти malloc.

...