segmentation fault
segmentation fault(セグメンテーション違反)は、許可されていないメモリ領域へのアクセス あるいは 操作によって発生するエラーである。 例えば、NULLポインタの指すアドレスに値を書き込もうとした場合に発生する。
#include <stdlib.h> #include <stdio.h> int main(int argc, char* argv[]) { int *pn = NULL; printf("%p\n", pn); // 0x0 *pn = 1; // Segmentation fault exit(0); }
gdbを使えば、詳細な情報を得られる。
$ gdb a.out (gdb) r Starting program: Reading symbols for shared libraries +.............................. done 0x0 Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 0x0000000100000ec7 in main () (gdb) info stack #0 0x0000000100000ec7 in main ()
segmentation fault発生時には、UNIX系システムではSIGSEGVシグナルを受け取る。
#include <stdlib.h> #include <stdio.h> #include <signal.h> void segv_handler() { puts("trap SIGSEGV\n"); exit(1); } int main(int argc, char* argv[]) { int *pn; printf("%p\n", pn); signal(SIGSEGV, segv_handler); *pn = 1; exit(0); }