Проблемы с использованием execvp в построенной строке

Я пытаюсь написать оболочку, и часть ее построения выполняет код из введенной пользователем строки (буфера). Однако, когда я пытаюсь выполнить execvp строку с дополнительными входами (ae. Echo a), она всегда зажимает pooch и возвращает -1. Я не понимаю, почему. Вот соответствующие fragmentы:

char * buffer = calloc(100, sizeof(char)); ... fgets(buffer, 100, stdin); buffer[strlen(buffer) - 1] = 0; // necessary because of a newline inserted by fgets ... cmd = strsep(&buffer, " "); char * str = malloc(50 * sizeof(char)); strcat(str, "./"); strcat(str, cmd); strcat(str, ".out"); ... i = execvp(str, (char * *) buffer); 

buffer аргументов неверен. Второй аргумент execvp – это массив указателей. С этим приведением вы избегаете предупреждения компилятора, но это не работает.

Здесь я вижу пару потенциальных проблем.

Во-первых, вы выделяете пространство с помощью malloc (что означает, что содержимое не инициализируется), но сразу же с помощью strcat для его записи. Если (по какому-либо изменению) первый символ является '\0' , это оставляет вам строку, начинающуюся с мусора, а затем данные, которые вы пытаетесь поместить туда. Это также (очень легко) привело бы к записи за конец буфера, что дало бы неопределенное поведение.

Если бы это strcat от меня, я бы использовал sprintf вместо strcat . По крайней мере, то, что вы показали, будет работать: sprintf(str, "./%43s.out", cmd);

Две проблемы:

  1. Вы передаете неинициализированную строку первому strcat.
  2. execvp ожидает массив строк, а не одну строку с нулевыми полями.