【发布时间】:2015-03-20 10:49:15
【问题描述】:
我在 SO 中闲逛,看到了 this question。然后我开始怀疑我是否可以溢出argc。
标准规定argv[argc] 必须是一个空指针,但如果 argc 溢出,这将是错误的。
(我wrote一个小C程序和一个python脚本来测试它,但得到了一个MemoryError。)
谢谢!
Rationale for International Standard — Programming Languages — C §5.1.2.2.1 程序启动
argc和argv作为main的参数的规范认可了广泛的先前实践。argv[argc]需要为空指针,以提供对列表末尾的冗余检查,也是根据惯例。
【问题讨论】:
-
Standard says that argv[argc] must be a null pointer but this will be false if argc overflow-- 我把它读作“不要让 argc 溢出”。 (“医生,我这样做会很痛”) -
在 POSIX 和大多数 Linux 系统上,
main的初始堆栈 - 由execve- 安装,包括它的参数(即argv),受到更多限制(通常,几兆字节)。所以argc不到几百万,我从来没有听说过argc可能接近INT_MAX的操作系统 -
可以说,在这种情况下,实现将具有系统特定的限制,无法将 2^15 个参数传递给程序
-
好吧,我当然不会输入它们:)
-
等一下,“我不会感到惊讶”是什么意思。任何 LP64 或 LLP64 架构都符合要求,因此 Windows 或 Linux。不过,您需要大量 RAM。我想如果从头开始,
argc应该有类型size_t。
标签: c integer-overflow