编译器错误导致execve失败?

时间:2016-01-14 01:30:37

标签: c gcc pipe execve

我在C程序中遇到了一些神秘的东西,它在我的电脑上工作正常,但是当我在我正在处理的服务器上编译它时失败了。基本上execve的执行失败了。原来的程序不是太大,所以我开始削减一些部分,以试图了解可能出现问题的地方。

这里有一个程序的剪辑(它只是一个剪切,当然它没有任何意义),好吧,在这里execve仍然失败:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>

int main (){
    // Arguments
    char *argv[100] = {"/home/input/input", [1 ... 99] = "A"};

    //The real program would use some pipes later
    int pipestdin[2];
    int pipestderr[2];

    pipe(pipestdin);
    pipe(pipestderr);

    // Call
    char *env = "\xde\xad\xbe\xef=\xca\xfe\xba\xbe";
    execve("/home/input/input",argv,&env);  // Execute the program  
    printf("ERROR\n"); // printed only if execve fails

    return 0;

}

但是当我拿出这部分时:

    int pipestdin[2];
    int pipestderr[2];

    pipe(pipestdin);
    pipe(pipestderr);

程序再次开始工作。

以下是一些信息:

当我使用在我的电脑上编译的版本时,程序在服务器上正常工作,这就是为什么我认为编译器存在问题。

1 个答案:

答案 0 :(得分:4)

argv是一个char*数组,应该以{{1​​}}指针终止。换句话说,最后一个有效元素后面的元素应该是NULL

NULL是一个类似的结构。您应该将envp声明为envp,就像您对char*[]所做的那样,并将其argv传递给&

请注意:大多数情况下,当您的程序无法运行时,它不是编译器错误。您的编译器和操作系统库已经过数百万的测试,如果有错误,它通常会在它到达之前修复。