리눅스 커널 코드 스니펫 #19 move_addr_to_user
6.6.4 net/socket.c:275 move_addr_to_user(kaddr: struct sockaddr *, klen: int, uaddr: > void *, ulen: > int *) 커널 공간의 소켓 주소 정보를 사용자 공간으로 복사하는 함수입니다. klen 의 크기가 sizeof(struct sockaddr_storage) 크다면 그것은 버그이기에 미리 정의된 매크로를 이용하여 버그를 알리게 됩니다. 이 버그가 발생하면 궁극적으로는 ./include/linux/compiler.h:136 에서 __builtin_unreachable() 함수를 호출하도록 되어 있는데, __builtin_unreachable() 의 설명은 GCC 문서에서 확인할 수 있습니다. BUG_ON 조건에 부합되면, 프로그램은 Segment Fault 를 발생시킬 것입니다. move_addr_to_kernel 함수와는 반대로 먼저 소켓 주소의 유효성을 검사한 후에 그것을 사용자 공간의 메모리로 복사합니다. https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html