gpt4 book ai didi

c++ - 未定义的行为或误报

转载 作者:行者123 更新时间:2023-11-28 04:07:43 25 4
gpt4 key购买 nike

我有一些 C++ 代码片段,当在 Xcode 上运行并打开未定义的行为 sanitizer 时,报告:“运行时错误:存储到类型‘int’的未对齐地址 0x7f8bcc403771,这需要 4 字节对齐 ”。

所以我创建了一个小的 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。如果您想在 malloc 内存的前四个字节中有一个指针,请使用 &data[0]&data

关于c++ - 未定义的行为或误报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58415759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com