C程序的参数是否保证'\ 0'终止?

时间:2014-05-05 19:46:31

标签: c security posix c11 execve

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

  

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

此上下文中的“string”一词是否应解释为“以0结尾的字符串”,即一系列非0字符后跟最终的' \ 0'或do / may一些实现以不同的方式将参数传递给程序?

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

1 个答案:

答案 0 :(得分:7)

  

此上下文中的“string”一词是否应解释为“以0结尾的字符串”,即一系列非0字符后跟最终的' \ 0'或do / may一些实现以不同的方式将参数传递给程序?

7.1.1定义一个字符串:

  

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


  

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

exec系列的POSIX spec状态是以空字符结尾的字符串,并且没有指定如果它们不存在会发生什么。可能是它未定义的行为。这似乎是合理的,因为exec函数没有合理的方法来验证每个参数是否正确地以null结尾。 (尽管请记住exec*必须复制其参数,因为地址空间即将被换出。)