未定义的行为或误报

时间:2019-10-16 14:30:22

标签: c++ undefined-behavior clang++ sanitizer

我有一些C ++代码,当在Xcode上运行且未定义行为消毒程序打开时,报告为:“ 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 个答案:

答案 0 :(得分:1)

malloc()将始终返回针对任何可能的数据类型适当对齐的指针。 &data[1]指向该字节的 second 字节的指针,对于任何具有对齐要求> 1的数据类型,显然正确对齐。如果要在已分配的内存的前四个字节中使用指针,请使用&data[0]&data