将空程序参数向量传递给execve()合法吗?

将空程序参数向量传递给execve()合法吗?,c,linux,gdb,exec,system-calls,C,Linux,Gdb,Exec,System Calls,考虑以下C代码(x86_64) 下一次在gdb上运行时,起初我还得到了一个SIGABRT,但是我做了第二次运行,它成功了 为什么? 我测试了/bin/sh,发现它总是与*argv[]=NULL… 我再次编写了一些可执行文件(不需要任何参数)进行测试,并发现它们都可以工作 因此,我猜只有/bin/sh或其他shell可以在*argv[]设置为NULL的情况下工作,其他文件(如/bin/ls)会出现故障或意外行为。系统调用的手册页显示 argv和envp数组必须在数组末尾包含一个空指针 如果您的程

考虑以下C代码(x86_64)

下一次在gdb上运行时,起初我还得到了一个
SIGABRT
,但是我做了第二次运行,它成功了

为什么?


我测试了
/bin/sh
,发现它总是与*argv[]=NULL…
我再次编写了一些可执行文件(不需要任何参数)进行测试,并发现它们都可以工作


因此,我猜只有
/bin/sh
或其他shell可以在*argv[]设置为NULL的情况下工作,其他文件(如
/bin/ls
)会出现故障或意外行为。

系统调用的手册页显示

argv
envp
数组必须在数组末尾包含一个空指针

如果您的程序不符合这些要求,则无法确定从那时起情况会如何。如果它对某些程序“有效”,那就是运气不好


手册页还说

按照惯例,这些字符串中的第一个(即,
argv[0]
)应该包含与正在执行的文件关联的文件名


该约定相当强大(由POSIX授权),因此未能做到这一点的程序可能会被认为是有缺陷的。如果您要依赖于
argv[0]
,那么您的
main()
测试它是否被正确调用可能是一个好主意,这样您就可以通过一条漂亮的错误消息而不是错误失败,但并非所有程序都这样做。

系统调用的手册页显示

argv
envp
数组必须在数组末尾包含一个空指针

如果您的程序不符合这些要求,则无法确定从那时起情况会如何。如果它对某些程序“有效”,那就是运气不好


手册页还说

按照惯例,这些字符串中的第一个(即,
argv[0]
)应该包含与正在执行的文件关联的文件名


该约定相当强大(由POSIX授权),因此未能做到这一点的程序可能会被认为是有缺陷的。如果您要依赖于
argv[0]
,那么您的
main()
测试它是否被正确调用可能是一个好主意,这样您就可以通过一条漂亮的错误消息而不是错误失败,但并非所有程序都会失败。

阅读。阅读并查看它期望的参数。是的,我知道它是UB,也知道parameters execve()期望的参数,但有没有办法弄清楚它为什么会起作用,或者仅仅是运气。我正在解决一些安全挑战,如果我能找出它为什么有效,这可能是对我的外壳代码的一个巨大改进。@poming您正在运行什么操作系统?阅读。阅读并查看它需要什么参数。是的,我知道它是UB,也知道parameters execve()需要什么,但有没有办法找出它为什么有效,或者只是运气好。我正在解决一些安全挑战,如果我能找到它工作的原因,这对我的外壳代码来说可能是一个很大的改进。@poming你在运行什么操作系统?
#include <unistd.h>
int main()
{
    execve("/bin/ls", 0, 0);
}
A NULL argv[0] was passed through an exec system call.  
Aborted
Starting program: /bin/ls 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".