随机char * args []传递给execv

时间:2017-12-27 11:46:56

标签: c pointers random exec

我需要创建一个char * array []然后我必须传递给execv。

  • 第一个元素是路径“./exec_test”
  • 第二个参数:在A / B
  • 之间随机挑选
  • 第三个参数:选择一个随机字母A - Z
  • 代表第四个参数:在[2,2 + A_CONST]
  • 之间选择随机整数
  • 然后是NULL

    void perform_exec(){
        char *type= 'A' + (random() % 2);
        char *name= 'A' + (random() % 64);
        int rand_num= rand(); 
    
        char *args[5];
        args[0]= "./test_exec";
        args[1]= name;
        args[2]= type;
        args[3]= rand_num;
        args[4]= NULL;
    
        execv(args[0], args);
        printf("you souldn't see this. exec error\n");
        exit(EXIT_FAILURE);
    

    }

我知道这段代码存在严重错误,但实际上无法弄清楚它是什么。

我收到错误#014:地址错误。

1 个答案:

答案 0 :(得分:1)

<强> i get Error #014: Bad address.

错误消息非常清楚,您的程序正在尝试使用无效的地址。

errno 14代表EFAULT

来自execve

  

EFAULT

     

文件名指向可访问的地址空间之外。

由于这些陈述,您的程序会抛出此错误:

args[1]= name;
args[2]= type;
args[3]= rand_num;

此处args的类型为char (*)[],它是char指针的数组。 因此,您要为char指针分配整数类型值,编译器必须为此提供警告

execv()访问传递给它的参数,并且它正在提出Bad address错误,因为它正在考虑args[1]name),args[2]({{ 1}})和typeargs[3])作为地址,并尝试访问那些无效的地址值。

你可以这样做:

rand_num

其他:

运行程序时,您必须为void perform_exec(){ char type= 'A' + (random() % 2); char name= 'A' + (random() % 64); int rand_num= rand(); char *args[5]; args[0]= "./test_exec"; args[1] = malloc (2 * sizeof(char)); //2 as it is either A or B args[1][0] = type; args[1][1] = '\0'; args[2] = malloc (2 * sizeof(char)); //2 as it is a character args[2][0] = name; args[2][1] = '\0'; args[3] = malloc (11 * sizeof(char)); //11 as INT_MAX is having 10 digits snprintf (args[3], 11, "%d", rand_num); args[4]= NULL; execv(args[0], args); perror("execv failed:"); free(args[1]); free(args[2]); free(args[3]); exit(EXIT_FAILURE); } typename获取相同的值。您可能希望每次要运行程序时更改随机数,并使用srand()srandom()