我有一些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);
}
所以我的问题是:这是未定义的行为,是误报还是由于默认编译器标志的某些更改,将来代码中可能会中断某些内容?
答案 0 :(得分:1)
malloc()
将始终返回针对任何可能的数据类型适当对齐的指针。 &data[1]
指向该字节的 second 字节的指针,对于任何具有对齐要求> 1
的数据类型,显然未正确对齐。如果要在已分配的内存的前四个字节中使用指针,请使用&data[0]
或&data
。