gpt4 book ai didi

可以将空字符传递给字符串中间的 argv 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:15 26 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
write(STDOUT_FILENO, argv[1], atoi(argv[2]));
return 0;
}

以下输出(在 Ubuntu 上的 bash 中运行)显示“xyz”未在 argv 中传递。我想确保这是操作系统的限制,而不是 shell。所以不可能在 argv 中的字符串中间传递空字符。有人可以确认吗?谢谢。

$ ./main.exe $'abc\000xyz' 7 | xxd
00000000: 6162 6300 3700 53 abc.7.S

最佳答案

所有程序都由 exec 调用启动,尽管有操作系统实现,让我们看看 POSIX 标准对 exec functions 说了什么.

int execve(const char *path, char *const argv[], char *const envp[]);

argv 是传递给程序的参数,envp 是环境变量。

The argv and environ arrays are each terminated by a null pointer. The null pointer terminating the argv array is not counted in argc.

The argument argv is an array of character pointers to null-terminated strings.

所以,很容易得出结论:

  1. 可以将空(零长度)字符串传递给 argv
  2. NULL 字符串不能传递给 argv,它将终止 argv,并丢弃所有后续参数。
  3. argv中的任何字符串都不能包含\x0字符,\x0将终止当前参数字符串。

解释运行时发生了什么

python -c 'print "\x30\x00\x31"' | xargs --null prog

尝试:

python -c 'print "\x30\x00\x31"' | strace -f xargs --null echo

我们可以发现:

...
...
...
read(0, "0\0001\n", 4096) = 4
...
...
...
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f09f46d9850) = 21232
strace: Process 21232 attached
...
...
...
[pid 21232] execve("/bin/echo", ["echo", "0", "1\n"], 0x7ffe5ccd7638 /* 74 vars */ <unfinished ...>

它表明 xargs 在调用 prog 时可能会将包含 \x0 的参数分成两个参数。不是 shell 做的,不是 OS、libc 做的,而是 xargs

关于可以将空字符传递给字符串中间的 argv 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54938639/

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