处理argc等于0

Pra*_*tic 11 c c++ argc

我最近看到一些好奇的东西.在HHVM源代码中,该main()函数的前3行内容如下:

if (!argc) {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这有点傻,但是,我还是忍不住想知道...... 为什么要回归0!并不是我认为有一些正确的方法可以解决这个问题,但通常与成功相关的0返回似乎特别不合适.

除了没有崩溃,有没有一个适当的响应argc0?(甚至还不到0?)这有关系吗?

我知道最终在argc0 的情况下结束的唯一方法是exec()和朋友一起.如果出于某种原因确实发生了这种情况,那几乎可以肯定是调用者中的一个错误,而被调用者无法做很多事情.

(标记为C和C++,因为我希望这两种语言的答案是相同的)

编辑:为了使问题不那么模糊和哲学,我会提供另一种选择.

if (!argc) {
  puts("Error: argc == 0");
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

关键点是有错误的指示并返回非零值.这种情况极不可能需要,但如果是这样,你可能会尝试指出错误.另一方面,如果检测到的错误严重到argc等于0,那么尝试访问stdout或C标准库可能是不好的.

Jon*_*ler 7

Note that the C11 standard explicitly allows for argc == 0:

5.1.2.2.1 Program startup

1 The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

或同等学历; 10)或以某种其他实现定义的方式.

2如果声明它们,main函数的参数应遵守以下约束:

  • argc的值应为非负值.
  • argv[argc] 应为空指针.
  • 如果值argc大于零,则argv[0]通过 argv[argc-1]包含的数组成员应包含指向字符串的指针,这些指针在程序启动之前由主机环境给出实现定义的值.目的是在程序启动之前从托管环境中的其他地方向程序提供信息.如果主机环境不能提供大写和小写字母的字符串,则实现应确保以小写形式接收字符串.
  • 如果值argc大于零,则指向的字符串argv[0] 表示程序名称 ; argv[0][0]如果程序名不能从主机环境获得,则应为空字符.如果值argc大于1,则argv[1]through 指向的字符串argv[argc-1] 表示程序参数.
  • 数组指向的参数argcargv字符串argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.

10)因此,int可以替换为定义为的typedef名称int,或者argv可以写为 的类型char ** argv,依此类推.

如果值argc大于零的两个要点明确允许argc == 0,尽管这种情况很不寻常.

因此,从理论上讲,程序可以采取预防措施,但argv[0] == 0即使argc == 0这样,只要代码不取消引用空指针,它应该没问题.许多计划,甚至大多数计划,都没有采取这些预防措施; 他们假设argv[0]不会是空指针.


who*_*oan 5

我认为这只是防御性编程的一个例子,因为HHVM的源代码(文件hphp/hhvm/main.cpp)中有以下片段:

int main(int argc, char** argv) {
  if (!argc) {
    return 0;
  }
  HPHP::checkBuild();
  int len = strlen(argv[0]);
Run Code Online (Sandbox Code Playgroud)

在行中:

int len = strlen(argv[0]);
Run Code Online (Sandbox Code Playgroud)

if argc == 0-> argv[0] == NULLandstrlen(argv[0])将导致分段错误。

我不熟悉HHVM,但他们可以假设某个程序可以在没有参数的情况下调用该程序(甚至没有程序名称)。

  • @cmaster `strlen(argv[0])` 会导致未定义的行为。这会产生比分段错误更糟糕的潜在后果。 (3认同)