有没有办法避免在发生堆栈粉碎时终止程序?

时间:2017-03-25 09:31:10

标签: c++ multithreading pthreads stack-smash

我在C ++中使用pthread编写了一个包含3个线程的程序。当其中一个线程发生缓冲区溢出时,整个程序终止,其他线程无法运行,并显示以下消息:*** stack smashing detected ***: ./a.out terminated
我想堆栈粉碎只会杀死BOF发生在其中的线程,其他线程仍然存活。所以,我试图忽略信号,但它并没有解决我的问题 这是我的计划:

#include <unistd.h>
#include <pthread.h>
#include <iostream>
#include <signal.h>
#include <string.h>

using namespace std;

int a = 0;

void sig_func(int sig)
{
}

void *func (void *arg)
{
  int c = a++;
  cout << "start thread " << c << endl;
  if (c == 1)
  {
    char stuff[8];
    strcpy(stuff, "123456789");
  }
  cout << "end thread " << c << endl;
}

int main ()
{
  pthread_t tid1, tid2, tid3;
  for(int i = 1; i <=31 ; i++)  //this line ignores all signals from 1 to 31.
     signal(i,sig_func);
  pthread_create (&tid1, 0, func, 0);
  sleep (1);
  pthread_create (&tid2, 0, func, 0);
  sleep (1);
  pthread_create (&tid3, 0, func, 0);
  sleep (1);
  return 0;
}

当我用g++ a.cpp -lpthread编译它时,输出如下:

start thread 0
end thread 0
start thread 1
end thread 1
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

有没有办法堆叠粉碎只导致杀死BOF中出现的线程,程序没有终止?
请注意,我不想使用-fno-stack-protector选项编译我的程序,以避免被金丝雀保护。

1 个答案:

答案 0 :(得分:0)

  

有没有办法避免在发生堆栈粉碎时终止程序?

没有