根据标准
所以,从你的话:
argv[argc]
必须是空指针
因此,argc
不能溢出,因为这样上面的说法就不成立了.
实际上
实际上,传递给程序的参数的总大小是有限的.
在我的Linux/x64系统上:
$ getconf ARG_MAX
2097152
因此,总参数大小约为2兆字节,argc
不能溢出.我相信这个限制衡量的是argv
中的总数据和环境的组合.如果在try 运行命令时超过此限制,exec()
将失败,E2BIG
将失败.从man 2 execve
开始:
E2BIG The total number of bytes in the environment (envp) and argument
list (argv) is too large.
我相信,与其他系统相比,我的系统的~2 MB限制相对宽松.我的OS X系统报告限制为约260KB.
But what if ARG_MAX
were really big?
好的,让我们假设您在一个旧的/奇怪的系统上,所以int
是16位,而arg_max远远大于215,否则这是相当合理的.现在,假设您使用2个以上的15参数调用execve()
.该实现有两个选项.
它可以让argc
个溢出...基本上,扔掉你的数据,确保你正在运行的程序以某种意想不到的、可能是错误的方式执行,并且违反了C标准.最糟糕的是,错误是silent的,所以你可能永远不会知道.
或者,它可以简单地从execve()
返回EOVERFLOW
,通知您它无法运行具有那么多参数的图像.现在,POSIX/SUS标准没有提到任何关于这个错误结果的内容...但是,我怀疑这仅仅是因为标准编剧从未期望ARG_MAX
大于INT_MAX
.
选项2是only个合理选项.如果你的系统以某种方式 Select 了选项#1,那么它是broken,你应该提交一份错误报告.
或者,您可以try 运行一个为16位系统编译的旧程序,但您正在通过某种仿真器或兼容层来运行它.如果您试图向程序传递超过2个15参数,我希望emulator或兼容层会给出错误消息.