今天看到百度知道上有人問棧溢出怎麼檢測,我好奇心起,查了一下,結果查到linux上有一個強大的庫libsigsegv,可以檢測棧溢出(說不定也是用訊號實現的)。測了一下,果真可以。此庫可以在http://www.gnu.org/software/libsigsegv/上下載到。
#include <stdio.h> #include <stdlib.h>#include "sigsegv.h"static int size = 0;void oink() { int garbage[1024]; // push this onto the stack. //#ifdef DEBUGsize += sizeof(int); fprintf(stderr, "allocated %d kb of stack memory\n", size); //#endif /* DEBUG */ oink(); } voidstackoverflow_handler (int emergency, stackoverflow_context_t scp){ printf ("Stack overflow caught."); exit(0); //sigprocmask (SIG_SETMASK, &mainsigset, NULL); //sigsegv_leave_handler (stackoverflow_handler_continuation, // (void *) (long) (emergency ? -1 : pass), NULL, NULL);}#ifndef SIGSTKSZ# define SIGSTKSZ 16384#endifint main() { char mystack[SIGSTKSZ];stackoverflow_install_handler (&stackoverflow_handler, mystack, sizeof (mystack)); oink(); return 0;}