sigaltstack でシグナルハンドラ用の代替スタックを指定

SIGSEGV がうまくハンドルできない は代替スタックを指定すべきだったことを id:kazuhooku に教えてもらった。
こうしておけばスタックオーバーフローでも正しくシグナルハンドラが呼ばれる。
man sigaltstack にある例の通り。

    stack_t ss;
    ss.ss_sp = GC_malloc(SIGSTKSZ);
    if (ss.ss_sp == NULL) {
        fprintf(stderr, "setSignalHandler malloc failed\n");
        exit(-1);
    }
    ss.ss_size = SIGSTKSZ;
    ss.ss_flags = 0;
    if (sigaltstack(&ss, NULL) == -1) {
        fprintf(stderr, "setSignalHandler sigaltstack failed\n");
        exit(-1);
    }

    struct sigaction sa;
    sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
    sigemptyset(&sa.sa_mask);
    sa.sa_sigaction = signal_handler;
    if (sigaction(SIGSEGV, &sa, NULL) != 0 ||
        sigaction(SIGTRAP, &sa, NULL) != 0 ||
        sigaction(SIGBUS, &sa, NULL) != 0 ||
        sigaction(SIGILL, &sa, NULL) != 0) {
        fprintf(stderr, "setSignalHandler sigaction failed\n");
        exit(-1);
    }