4

关于 的论点main(),2011 C 标准说 (5.1.2.2.1:2):

如果 argc 的值大于零,则数组成员 argv[0] 到 argv[argc-1] 应包含指向字符串的指针,这些指针在程序启动之前由主机环境给出实现定义的值。

在这种情况下,单词“string”是否应该被解释为“0-terminated string”,即一系列非 0 字符后跟一个最终的 '\0',或者某些实现是否/可以以不同的方式将参数传递给程序?

在 POSIX 平台上,exec*函数家族之一的参数是否被函数验证exec*为指向格式良好的字符串的指针(以及如何?),或者 setuid 程序是否应该避免假设它已通过格式正确的 0-终止字符串作为参数?

4

1 回答 1

8

在这种情况下,单词“string”是否应该被解释为“0-terminated string”,即一系列非 0 字符后跟一个最终的 '\0',或者某些实现是否/可以以不同的方式将参数传递给程序?

7.1.1 定义一个字符串:

字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。


exec* 系列函数之一的参数是否由 exec* 函数验证为指向格式良好的字符串的指针(以及如何?)。

POSIX 规范声明该系列的 args是以execnull 结尾的字符串,并且没有指定如果它们不是会发生什么。大概是未定义的行为。这似乎是合理的,因为函数没有合理的方法exec来验证每个参数是否正确以空值结尾。(尽管记住exec*必须复制它的参数,因为地址空间即将被换出。)

于 2014-05-05T19:52:55.200 回答