c++ - 未定义的行为或误报
问题描述
我有一些 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]
or&data
如果你想在 malloc'ed 内存的前四个字节中有一个指针。
推荐阅读
- ios - 如何设置渐变颜色以在深色模式下查看 ios?
- arduino - Arduino,将分钟转换为 hh mm sec
- javascript - Javascript 根据属性值从对象数组中获取下一个对象
- api - Google Script 上的 Authentication Required 消息
- excel - Excel 365 - “主文件”的动态更改路径 - Power Query
- pandas - 为循环中的每个索引创建 DataFrame
- php - 多级排序多维数组
- javascript - 使用 useEffect() 管理功能组件的状态
- python - 在 SageMaker 上将 AWS Glue 输出文件读入 TensorFlow 批量转换的正确方法是什么
- python - 我如何制作一个显示机器人正在玩的所有成员的机器人状态?