由于未对齐的内存地址,内存地址是否会被破坏?
Could memory addresses be corrupted, because of unaligned memory address?
所以,当我试图访问这个 0x303030303a303030
地址时。我收到 SIGBUS
错误。
"Normal/valid" 地址类型如下:0xffc8613d68
。
并且所有指针都是有效的,直到发生某些事情。
那么,指针是否因为 "unaligned" 内存地址而损坏?
一般来说,"unaligned" 内存地址的症状是什么?
演出后的样子?
我的案例发生在 MIPS 上。
entries = {
next = 0x36312e30382e3438,
prev = 0x3000300035322e31
}
nice_ptr = 0x303030303a303030,
imp_data= 0x30303a303030303a <error: Cannot access memory at address 0x30303a303030303a>,
nimp_data= 0x323030303a3130
我怀疑您看到的是未定义行为的结果。很可能你的一个错误指针导致你的程序指向一页不相关的数据,你的调试器试图理解它是否包含有效的数据结构,但由于它没有,你的调试器显示无意义的值基于关于误解 在该位置 的不相关数据。
尝试取消引用 CPU 上不支持未对齐访问的 unaligned/misaligned 地址通常会引发 SIGBUS 样式的陷阱。 (请注意,即使在像 x86 这样的 CPU 上,unaligned/misaligned 取消引用也被认为是未定义的行为,其中 CPU 确实 支持它,在这种情况下问题的症状可能要微妙得多,因为您可能最终得到的计算结果不正确,而不是明显的崩溃,或者仅在某些 CPU 上崩溃,而在其他
上不崩溃。
所以简短的回答是:不要取消引用未对齐的指针(或者如果必须,请确保将它们转换为 const char *
或类似的,以便编译器可以执行允许此类访问所需的操作- 并且要非常小心你用那个指针做什么)。如果您需要将未对齐的数据(例如,从网络数据包或加载的二进制文件)复制到对齐的 int
或 float
或其他任何内容,请通过例如memcpy(&myFloat, my_unaligned_char_ptr, sizeof(myFloat));
而不是通过未对齐的 int/float/etc 指针和赋值运算符。 memcpy()
将正确处理未对齐的取消引用,但 =
不会。
所以,当我试图访问这个 0x303030303a303030
地址时。我收到 SIGBUS
错误。
"Normal/valid" 地址类型如下:0xffc8613d68
。
并且所有指针都是有效的,直到发生某些事情。
那么,指针是否因为 "unaligned" 内存地址而损坏?
一般来说,"unaligned" 内存地址的症状是什么? 演出后的样子?
我的案例发生在 MIPS 上。
entries = {
next = 0x36312e30382e3438,
prev = 0x3000300035322e31
}
nice_ptr = 0x303030303a303030,
imp_data= 0x30303a303030303a <error: Cannot access memory at address 0x30303a303030303a>,
nimp_data= 0x323030303a3130
我怀疑您看到的是未定义行为的结果。很可能你的一个错误指针导致你的程序指向一页不相关的数据,你的调试器试图理解它是否包含有效的数据结构,但由于它没有,你的调试器显示无意义的值基于关于误解 在该位置 的不相关数据。
尝试取消引用 CPU 上不支持未对齐访问的 unaligned/misaligned 地址通常会引发 SIGBUS 样式的陷阱。 (请注意,即使在像 x86 这样的 CPU 上,unaligned/misaligned 取消引用也被认为是未定义的行为,其中 CPU 确实 支持它,在这种情况下问题的症状可能要微妙得多,因为您可能最终得到的计算结果不正确,而不是明显的崩溃,或者仅在某些 CPU 上崩溃,而在其他
上不崩溃。所以简短的回答是:不要取消引用未对齐的指针(或者如果必须,请确保将它们转换为 const char *
或类似的,以便编译器可以执行允许此类访问所需的操作- 并且要非常小心你用那个指针做什么)。如果您需要将未对齐的数据(例如,从网络数据包或加载的二进制文件)复制到对齐的 int
或 float
或其他任何内容,请通过例如memcpy(&myFloat, my_unaligned_char_ptr, sizeof(myFloat));
而不是通过未对齐的 int/float/etc 指针和赋值运算符。 memcpy()
将正确处理未对齐的取消引用,但 =
不会。