【问题标题】:Random char* args[] to pass to execv随机 char* args[] 传递给 execv
【发布时间】:2017-12-27 11:46:55
【问题描述】:

我需要创建一个 char* 数组[],然后我必须将其传递给 execv。

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

    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:地址错误。

【问题讨论】:

  • int 分配给char*..不是一个好方法。是的,您认为这些地址可以访问吗? 0RAND_MAX?
  • 提高编译器的警告级别并认真对待它的警告。
  • 实际上无法弄清楚它是什么”那么学习 C 呢?

标签: c pointers random exec


【解决方案1】:

i get Error #014: Bad address.

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

errno 14 代表EFAULT

来自execve

失败

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

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

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

这里argschar (*)[] 类型,它是char 指针数组。 因此,您将整数类型值分配给 char 指针,编译器必须为此提供 警告

execv() 访问传递给它的参数并给出Bad address 错误,因为它正在考虑args[1] (name)、args[2] (type) 和args[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);
}

补充:

运行程序时,typenamerand_num 的值必须相同。您可能希望在每次运行程序时更改随机数,并使用srand()srandom()

【讨论】:

  • sizeof (char) 根据定义等于 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2019-10-25
  • 1970-01-01
相关资源
最近更新 更多