我最近看到一些好奇的东西.在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标准库可能是不好的.
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 ofintand with no parameters:Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }or with two parameters (referred to here as
argcandargv, though any names may be used, as they are local to the function in which they are declared):Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }或同等学历; 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]表示程序参数.- 数组指向的参数
argc和argv字符串argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.10)因此,
int可以替换为定义为的typedef名称int,或者argv可以写为 的类型char ** argv,依此类推.
如果值argc大于零的两个要点明确允许argc == 0,尽管这种情况很不寻常.
因此,从理论上讲,程序可以采取预防措施,但argv[0] == 0即使argc == 0这样,只要代码不取消引用空指针,它应该没问题.许多计划,甚至大多数计划,都没有采取这些预防措施; 他们假设argv[0]不会是空指针.
我认为这只是防御性编程的一个例子,因为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,但他们可以假设某个程序可以在没有参数的情况下调用该程序(甚至没有程序名称)。