2016-06-18 1 views
0

私は単純なプログラム(以下のソースコード)で遊んでいます。そして、私のコンピュータの構成:printf行を追加した後にSIGFPEがトリガされないのはなぜですか?

のLinux MYMACHINE 3.13.0-49ジェネリック#83-UbuntuのSMP金4月10日午前20時11分33秒UTC 2015 x86_64のx86_64でのx86_64のGNU/Linuxの

gccのバージョン4.8.4(Ubuntuの〜14.04.3 4.8.4-2ubuntu1)

#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うんざりする。しかし、私は条件「場合」をチェック引数に単一の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

最近、あまりにも多くのPythonプログラミング...ありがとう! – drdot

関連する問題