x86-64 8byte aligned

C
uint64_t *ptr;
uint64_t val;
*ptr = val;

문제를 풀다가 다음과 같은 코드가 있었는데 난 당연히 ptr이 8바이트 정렬이 되어야 하는 줄 알았다.

아, 물론 정렬이 되어야 하는건 맞다. 하지만 안되어도 정의되지 않은 행동이 일어날뿐이지 의도대로 작동이 된다.

• 하드웨어(x86-64) 관점: 보통의 64비트 일반 명령(예: mov로 8바이트 로드/스토어)은 미정렬이도 동작 . 다만 옵션에 따라 정렬 예외(#AC) 를 켜면 사용자 모드에서 미정렬 접근이 예외로 터질 수 있음 . 또 128비트처럼 일부 명령(SSE movaps/movdqa 등)은 정렬을 요구해서 미정렬이면 바로 예외가 남 • C 언어/컴파일러 관점: uint64_t *p; *p=…; 에서 포인터가 그 타입에 맞게 정렬되지 않으면 ‘정의되지 않은 동작(UB)’ . 즉 “대부분 x86에선 우연히 잘 되는” 건 사실이지만, 컴파일러는 정렬을 가정하고 코드(심지어 정렬 요구가 있는 SSE 명령)를 낼 수 있고, 그럼 진짜로 크래시가 날 수 있다 → 하지만, 컴파일된 파일을 우리가 받기 때문에 정렬을 요구하는지 안하는지 우리가 판단이 가능함

즉, 우리가 ida로 봤을때 mov 명령어가 사용되는 것을 아니깐 인텐으로 풀 수 있음 → 하드웨어적으로 동작이 잘되게 설계를 해놓았으니깐