Есть ли способ избежать завершения программы при разрушении стека?

Я написал программу с 3 потоками, используя pthread на С++. Когда в одном из потоков происходит переполнение буфера, вся программа завершается, и другие потоки не могут быть запущены, и отображается это сообщение: *** 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, чтобы избежать защиты от канареек.


person majid zolfaghari    schedule 25.03.2017    source источник
comment
Мне любопытно, почему вы намеренно хотите отправить код, который разбивает свой стек (переполняет его буфер) и вызвать УБ.   -  person WhiZTiM    schedule 25.03.2017
comment
Невозможно контролировать то, что происходит, когда вы вызываете неопределенное поведение.   -  person Barmar    schedule 25.03.2017


Ответы (1)


Есть ли способ избежать завершения программы при разрушении стека?

No

person Richard Hodges    schedule 25.03.2017