首页 > 解决方案 > 未定义的行为或误报

问题描述

我有一些 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);
}

所以我的问题是:这是一个未定义的行为误报,还是由于默认编译器标志的一些更改,代码中的某些内容将来可能会中断?

标签: c++undefined-behaviorclang++sanitizer

解决方案


malloc()将始终返回一个针对任何可能的数据类型适当对齐的指针。&data[1]是指向第二个字节的指针,对于任何有对齐要求的数据类型,显然没有> 1正确对齐。使用&data[0]or&data如果你想在 malloc'ed 内存的前四个字节中有一个指针。


推荐阅读