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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]