2016-06-18 4 views
0

간단한 프로그램 (아래 소스 코드)을 가지고 놀고 있습니다. 그리고 내 컴퓨터 구성 :printf 줄을 추가 한 후 SIGFPE가 트리거되지 않는 이유는 무엇입니까?

리눅스하여 mymachine 3.13.0-49 제네릭 # 83 - 우분투 SMP 금 4월 10일 세계 협정시 20시 11분 33초 2015 x86_64에의 x86_64에의 x86_64의 GNU/리눅스

버전의 gcc 4.8.4 (우분투 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 성공적이다 티 깜박했다. 내가 검사 인수의 하나의 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

최근에 너무 많은 파이썬 프로그래밍 ... 감사합니다! – drdot

관련 문제