gpt4 book ai didi

argc 会溢出吗?

转载 作者:太空狗 更新时间:2023-10-29 16:15:51 26 4
gpt4 key购买 nike

我在SO里游荡,看到了this question .然后我开始怀疑我是否可以溢出 argc。

标准规定 argv[argc] 必须是空指针,但如果 argc 溢出,则为 false。

(我 wrote 一个小的 C 程序和一个 python 脚本来测试它但是得到了一个 MemoryError。)

谢谢!


Rationale for International Standard — Programming Languages — C §5.1.2.2.1 Program startup

The specification of argc and argv as arguments to main recognizes extensive prior practice. argv[argc] is required to be a null pointer to provide a redundant check for the end of the list, also on the basis of common practice.

最佳答案

按照标准

因此,根据您的引述:

argv[argc] is required to be a null pointer

因此,argc 不会溢出,因为那样上面的说法就不成立了。

实践

在实践中,传递给程序的参数的总大小是有限的。

在我的 Linux/x64 系统上:

$ getconf ARG_MAX2097152

因此,总参数大小约为 2 兆字节,argc 不会溢出。我相信这个限制衡量了 argv 和环境中的总数据的组合。如果在尝试运行命令时超过此限制,exec() 将失败并返回 E2BIG。来自 man 2 execve :

E2BIG  The total number of bytes in the environment (envp) and argument       list (argv) is too large.

我相信与其他系统相比,我系统的 ~2 兆字节限制相对宽松。我的 OS X 系统报告限制为 ~260KB。

但是如果 ARG_MAX 真的很大呢?

好吧,假设你在一个旧的/奇怪的系统上,所以 int 是 16 位,ARG_MAX 远远超过 215,否则这是很合理的.现在,假设您使用超过 215 个参数调用 execve()。实现有两个选项。

  1. 它可以让 argc 溢出...基本上,丢弃您的数据,确保您正在运行的程序以某种意外且可能错误的方式执行,并违反 C标准。最糟糕的是,错误是无声的,因此您可能永远不会知道。

  2. 或者,它可以简单地从 execve() 返回 EOVERFLOW,通知您它根本无法运行具有那么多参数的图像。现在,POSIX/SUS 标准没有提及任何关于此错误结果的信息......但是,我怀疑这仅仅是因为标准编写者从未期望 ARG_MAX 大于 INT_MAX.

选项 #2 是唯一合理的选项。如果您的系统以某种方式选择了选项 #1,那么它已损坏,您应该提交错误报告。

或者,您可能试图运行为 16 位系统编译的旧程序,但您正在通过某种模拟器或兼容层运行它。如果您尝试将超过 215 个参数传递给程序,我预计仿真器或兼容层会给出错误消息。

关于argc 会溢出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com