我在SO中徘徊,看到this question。然后我开始怀疑我是否可以溢出argc。
标准说argv[argc]
必须是一个空指针,但是如果argc溢出,它将为false。
(我wrote一个小的C程序和一个python脚本对其进行测试,但得到了MemoryError
。)
谢谢!
最佳答案
根据标准
因此,从您的报价:
因此,argc
不会溢出,因为以上语句将不成立。
在实践中
实际上,传递给程序的参数的总大小是有限的。
在我的Linux / x64系统上:
$ getconf ARG_MAX
2097152
因此,总参数大小约为2兆字节,并且argc
不会溢出。我相信此限制可以衡量argv
和环境中的总数据。如果在尝试运行命令时超过此限制,则exec()
将失败,并显示E2BIG
。从 man 2 execve
:
E2BIG环境(envp)和参数中的字节总数
列表(argv)太大。
我相信,与其他系统相比,我的系统上约2兆字节的限制相对宽松。我的OS X系统报告限制为260KB。
但是,如果ARG_MAX
非常大怎么办?
好的,假设您使用的是旧/古怪的系统,因此int
是16位,而ARG_MAX超过215,这在其他方面还是很合理的。现在,假设您使用超过215个参数调用execve()
。该实现有两个选择。
argc
溢出...基本上,丢弃数据,确保所运行的程序以某种意外且可能错误的方式执行,并且违反了C标准。最糟糕的是,该错误是无声的,因此您可能永远都不知道。 EOVERFLOW
返回execve()
,通知您它根本无法运行具有这么多参数的图像。现在,POSIX / SUS标准没有提及任何有关此错误结果的信息……但是,我怀疑这仅仅是因为标准编写者从未期望ARG_MAX
大于INT_MAX
。 选项#2是唯一合理的选项。如果您的系统以某种方式选择了选项#1,则该选项已损坏,您应该提交错误报告。
另外,您可能试图运行为16位系统编译的旧程序,但正在通过某种仿真器或兼容性层运行它。我希望如果尝试将215个以上的参数传递给程序,则仿真器或兼容性层会给出错误消息。