2016-06-18 4 views
0

Я играю с простой программой (исходный код ниже). И моя конфигурация компьютера:Почему SIGFPE не запускается после добавления строки printf?

Linux моя_машина 3.13.0-49-родовое # 83-Ubuntu SMP Пт 10 апреля 20:11:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

GCC версии 4.8.4 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3)

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 

void catcher(int a){ 
    setresuid(geteuid(),geteuid(),geteuid()); 
    printf("WIN!\n"); 
    system("/bin/sh"); 
    exit(0); 
} 

int main(int argc, char **argv){ 
    puts("source code is available in level02.c\n"); 

    if (argc != 3 || !atoi(argv[2])) 
    //printf("!atoi(argv[2]) = %d\n", !atoi(argv[2])); 
    return 1; 
    signal(SIGFPE, catcher); 
    printf("end\n"); 

    return abs(atoi(argv[1]))/atoi(argv[2]); 
} 

Я намерен инициировать SIGFPE в этой программе, вызвав исполняемый файл таким образом:

$./a.out -2147483648 -1 
source code is available in level02.c 

end 
WIN! 

Как вы можете видеть, SIGFPE успешно T riggered. Однако, если я раскомментировать один PRINTF строку в аргументе проверки «если» условие:

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 

void catcher(int a){ 
    setresuid(geteuid(),geteuid(),geteuid()); 
    printf("WIN!\n"); 
    system("/bin/sh"); 
    exit(0); 
} 

int main(int argc, char **argv){ 
    puts("source code is available in level02.c\n"); 

    if (argc != 3 || !atoi(argv[2])) 
    printf("!atoi(argv[2]) = %d\n", !atoi(argv[2])); 
    return 1; 
    signal(SIGFPE, catcher); 
    printf("end\n"); 

    return abs(atoi(argv[1]))/atoi(argv[2]); 
} 

И тогда я перекомпилировать программу и попытаться вызвать SIGFPE используя один и тот же путь. Я получаю только это:

source code is available in level02.c 

Что происходит?

ответ

1

Потому что теперь ваш исходный код имеет неправильный отступ по сравнению с тем, как он фактически разбирается.

if (argc != 3 || !atoi(argv[2])) 
    printf("!atoi(argv[2]) = %d\n", !atoi(argv[2])); 
return 1; 

Рассмотрите возможность размещения обоих операторов в блоке, чтобы этого избежать.

+0

Ooh ... слишком много программирования python в последнее время ... Спасибо! – drdot

Смежные вопросы