我在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个以上的参数传递给程序,则仿真器或兼容性层会给出错误消息。

    10-07 13:34
    查看更多