为什么这个带有“abort()”的C程序不会崩溃?

时间:2018-04-12 10:46:52

标签: c crash

我正在尝试编写一个崩溃的简单C程序。如果没有提供输入,我希望下面的一个崩溃。

#include <stdlib.h>
int main(int argc, char * arg[]){
  if (argc < 1){
    abort();

  }
}

我使用gcc编译了这个程序,然后用./a.out运行它,但没有任何反应,没有崩溃。知道为什么吗?谢谢。

2 个答案:

答案 0 :(得分:4)

有效。但是,无论何时从 shell ./a.out运行它,它都会有一个参数 - 程序名称。 C标准(C11 5.1.2.2.1p2说明如下:

  
      
  1. 如果声明它们,主函数的参数应遵循以下约束:

         
        
    • argc的值应为非负。 [即&gt; = 0!]
    •   
         

    [...]

         
        
    • 如果 argc的值大于零,则argv[0]指向的字符串代表程序名称;如果程序名不能从主机环境获得,则 argv [0] [0] 应为空字符。 [...]
    •   
  2.   

即。 C标准允许argc为&lt; 1 {}。 1,如果它正是0

实际上,至少在Linux中运行一个带有零参数的C程序,有点破解 - 从另一个用空参数调用execv的程序执行它列表:

abort.c:

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

int main(int argc, char * arg[]){
    printf("argc is %d\n", argc);
    if (argc < 1){
       abort();
    }
}

runner.c:

#include <unistd.h>

int main(void) {
    char *args[] = { NULL };
    execv("./abort", args);
}

然后:

% gcc abort.c -o abort
% gcc runner.c -o runner

现在如果你直接运行abort,你就会得到:

% ./abort
argc is 1

然而,runner

./runner 
argc is 0
Aborted (core dumped)

答案 1 :(得分:1)

它不会崩溃,因为argc是参数计数,当您执行./a.out argc值的程序为1时。所以不要检查

if (argc < 1){ /* 1<1 condition fails */
   abort();
}

检查

if (argc == 1){
    abort();
}

如果没有提供输入,我希望下面的一个崩溃。 ?为什么你希望它通过调用abort()来崩溃,exit(0)是一个好主意,它清理所有内容并正常终止进程。