argv[0] 可以包含空字符串吗?
在任何 C 程序中,命令行参数 argv[0] 都指向用于调用程序的名称。有没有什么情况会指向空字符串""
?
这种情况的示例代码片段将是一个很好的参考。
In any C program, the command line argument argv[0]
points to the name used to invoke the program. Is there any circumstance in which it will point to an empty string ""
?
An example code snippet for such a case would be a good reference.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
它是实现定义的。 §5.1.2.2.1 删节:
因此,如果
argc
大于零,则argv[0]
永远不会是空字符串,这是完全意图,但是它可能会发生。 (请注意,当argc
等于n
时,argv[0]
到argv[n - 1]
永远不会null 且始终指向字符串,但如果n
为零,则argv[0]
为 null。)当然,在实践中,您只需要确保您的目标平台按照需要运行即可。
It's implementation defined. §5.1.2.2.1 abridged:
So if
argc
is greater than zero, it's quite the intention thatargv[0]
never be an empty string, but it could happen. (Note that withargc
equal ton
,argv[0]
throughargv[n - 1]
are never null and always point to a string. The string itself may be empty, though. Ifn
is zero,argv[0]
is null.)In practice, of course, you just need to make sure the platforms your targetting behave as needed.
是的。
C 语言标准明确允许
argv[0]
可以是空指针,或它可以指向空字符串 (""< /代码>)。 N1256 5.1.2.2.1p2:
在类 Unix 系统上,程序由
exec()
系列函数之一(execl()
、execlp()
等)调用.),它允许调用者准确指定传递给main()
函数的参数。 (甚至可能以违反 C 标准规定的要求的方式调用程序。)请注意,该标准规定
argv[0]
(假设它既不为 null 也不为空)“代表程序名称”。该标准故意对它如何表示程序名称含糊其辞。特别是,它不需要提供可以调用程序的名称(因为标准甚至不要求可以通过名称调用程序)。Yes.
The C language standard explicitly allows for the possibility that
argv[0]
can be a null pointer, or that it can point to an empty string (""
). N1256 5.1.2.2.1p2:On Unix-like systems, programs are invoked by one of the
exec()
family of functions (execl()
,execlp()
, etc.), which allow the caller to specify exactly what arguments are passed to themain()
function. (It's even possible to invoke a program in ways that violate the requirements imposed by the C standard.)Note that the standard says that
argv[0]
(assuming it's neither null nor empty) "represents the program name". The standard is deliberately vague about how it represents the program name. In particular, it needn't provide a name by which the program can be invoked (since the standard doesn't even require that programs can be invoked by name).其他回复引用了 C 标准并表明
argv[0]
和 可以是NULL
也可以是空字符串 (""
) 。您应该在编写程序时假设这种情况可能发生,因为否则您就会造成(小)安全风险。调用您的程序并将argv
设置为攻击者想要的任何内容都很容易。作为证明,请考虑以下两个程序。第一个,echoargv.c
打印出argv
的内容:第二个,
argv0
,调用任何其他程序并让用户指定另一个程序的 argv:(这是 Posix 特定版本。非标准环境可能需要更改。)
使用它们的方法如下:
第一次运行
argv0
设置echoargv
的argv[0]
为 NULL。第二次运行使其成为空字符串。
第三次运行只是为了好玩:注意
argv[0]
不需要与程序的实际名称有关的任何内容。
这怎么能咬你呢?例如,如果您在使用消息中盲目地打印出程序的名称:
更好:
如果您不这样做,攻击者可能会导致您的程序随意出现段错误,或者可能会让您的程序报告完全错误的事情给用户。
Other replies have quoted the C standard and shown that
argv[0]
and can beNULL
or it can be the empty string (""
). You should write your program with the assumption that this can happen, because otherwise you are creating a (small) security risk. It's easy to invoke your program and setargv
to anything an attacker wants. As proof, consider the following two programs. The first one,echoargv.c
prints out the contents ofargv
:The second one,
argv0
, invokes any other program and lets the user specify the other program's argv:(This is a Posix-specific version. Non-standard environments may need changes.)
Here's how to use them:
The first run of
argv0
setsechoargv
'sargv[0]
to be NULL.The second run makes it be the empty string.
The third run is there just for fun: note how
argv[0]
doesn't need to haveanything to do with the actual name of the program.
How can this bite you? If, for example, you blindly print out the name of your program in a usage message:
Better:
If you don't do this, an attacker can cause your program to segfault at will, or might get your program to report entirely wrong things to the user.
argv[0] 在 C 中可以为 null,例如,如果您直接调用 main 函数(可以在 C 中完成一些技巧)。我不知道C++是否允许直接main调用。
argv[0] can be null in C, for example if you directly invoke a main function (with some tricks can be done in C). I don't know if C++ allows direct main invocation.