未定义的行为或误报

Undefined behaviour or false positive

本文关键字:未定义      更新时间:2023-10-16

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

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

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