我找不到一个体面的文档来解释对齐系统如何工作以及为什么某些类型比其他类型更严格一致.
据我所知,在以下行中,我们尝试写入无效的内存位置.但这实际上也是一个未对齐的指针.有人可以解释什么是未对齐的指针,以及下面的未对齐指针是什么?
*(int*)0xffffffff = 0xbad;
Run Code Online (Sandbox Code Playgroud) 我无法解释这个程序的执行行为:
#include <string>
#include <cstdlib>
#include <stdio.h>
typedef char u8;
typedef unsigned short u16;
size_t f(u8 *keyc, size_t len)
{
u16 *key2 = (u16 *) (keyc + 1);
size_t hash = len;
len = len / 2;
for (size_t i = 0; i < len; ++i)
hash += key2[i];
return hash;
}
int main()
{
srand(time(NULL));
size_t len;
scanf("%lu", &len);
u8 x[len];
for (size_t i = 0; i < len; i++)
x[i] = rand();
printf("out %lu\n", f(x, len));
}
Run Code Online (Sandbox Code Playgroud)
因此,当使用带有gcc的-O3编译并使用参数25运行时,它会引发段错误.没有优化它工作正常.我已经对它进行了反汇编:它正在进行矢量化,并且编译器假定 …
是否由于void*未定义的行为导致错位负载?
以下是我对Clang及其消毒剂的看法:
bufhelp.h:146:29: runtime error: load of misaligned address 0x7fff04fdd0e1 for type 'const uintptr_t' (aka 'const unsigned long'), which requires 8 byte alignment
0x7fff04fdd0e1: note: pointer points here
00 00 00 66 66 6f 6f 62 61 72 34 32 46 4f 4f 42 41 52 31 37 66 6f 6f 62 61 72 34 33 46 4f 4f 42
^
Run Code Online (Sandbox Code Playgroud)
这是演员阵容发挥作用的地方:
buf_xor(void *_dst, const void *_src1, const void *_src2, size_t len)
{
...
ldst = (uintptr_t *)(void …Run Code Online (Sandbox Code Playgroud)