Interactive Visualization of Kernel Stack Alignment Padding & Structure Zero-Initialization
C 언어에서 64비트 아키텍처는 데이터 정렬을 위해 4바이트 멤버 뒤에 4바이트 패딩 홀을 삽입합니다.
개발자가 구조체의 모든 멤버를 할당하더라도, 컴파일러가 생성한 패딩 공간에는 이전 스택 프레임의 데이터(카나리, 포인터)가 남아 그대로 유저 공간에 복사됩니다.
컴파일러(-ftrivial-auto-var-init=zero)가 함수 프롤로그에서 스택 프레임 전체를 0x00으로 소거합니다.
stp xzr, xzr, [sp] 명령어로 16바이트 단위 초고속 0 초기화.xorps/movaps 또는 rep stosq를 통한 즉각 소거.과거 GCC 11 이전에는 GCC 플러그인인 CONFIG_GCC_PLUGIN_STRUCTLEAK이 이 역할을 담당했습니다.
__user 속성 구조체만 초기화.INIT_STACK_ALL_ZERO가 플러그인을 완전히 대체하여 프로덕션 표준으로 안착함.