Signal handling e non-local jumps: terminando normalmente execução de programa com SIGSEGV

Em resposta a um comentário do Murilo, fiz um teste usando jump para seguir a execução do programa onde ocorre seg. fault.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
 
static jmp_buf env;
 
void policia(int sig, siginfo_t *info, void *x) {
	printf("Atenção, atenção!\n"
		"Suspeito qualificado no código %d foi "
		"encontrado no endereço %p\n", 
		info->si_code, info->si_addr);
 
	longjmp(env, 1);
}
 
 
int main(int argc, char **argv) {
	struct sigaction act;
	char **teste;
 
	act.sa_sigaction = policia;
	act.sa_flags = SA_SIGINFO;
 
	sigaction(SIGSEGV, &act, NULL);
 
	if (setjmp(env) == 0) {
		teste[1] = "foo"; /* Isto é um crime! */
	}
 
	return 0;
}

Quando o setjmp() é chamado a primeira vez, ele salva o atual estado de execução na variável env, para quem posteriormente o programa possa pular de volta para onde ele aponta, usando a função longjmp() para isso. O motivo do if, é que a setjmp() retorna 0 caso ela esteja sido invocada sem ter ocorrido o jump. Quando o longjmp() é invocado, a linha onde está a setjmp() é novamente executada, e desta vez, pelo fluxo ter sido direcionado pelo jump, a função retorna um valor diferente de zero.

E assim, nosso programa é terminado sem qualquer código de erro, como pode ser visto abaixo:

[felipe ~]$ ./sigsegv 
Atenção, atenção!
Suspeito qualificado no código 2 foi encontrado no endereço 0xb7ef57b4
[felipe ~]$ echo $?
0

Nem me fala hein?? Fui

Nem me fala hein??
Fui obrigado a assinar o RSS seu agora
X)

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options