Какова цель этой функции clear_mem? - PullRequest
0 голосов
/ 27 мая 2019

Я пытался понять, для чего именно предназначена эта функция, с которой я столкнулся .. Код намеренно имеет плохие практики кода, поэтому я пытаюсь выяснить, является ли это одним из них.

Вот функция:

void clear_mem(char *memblock, int siz) {
  register int i;

  for (i=0; i<=siz;i++)
      *(memblock+i) = 0;

}

Функция вызывается в следующей функции:

char *get_argument(char line[], int argno){
    char *argument = malloc(512);
    char clone[512];
    strncpy(clone, line, strlen(line)+1);

    int current_arg = 0;
    char *splitted = strtok(clone, " ");
    while (splitted != NULL){
        if (splitted[0] != ':'){
            current_arg++;
        }
        if (current_arg == argno+1){
            clear_mem(argument, 512); //Here
            strncpy(argument, splitted, strlen(splitted)+1);
            return argument;
            free(argument);
        }
        splitted = strtok(NULL, " ");
    }

    if (current_arg != argno){
        argument[0] = '\0';
    }
    free(argument);
    return argument;
}

Заранее спасибо!

1 Ответ

1 голос
/ 27 мая 2019

В этом коде:

for (i=0; i<=siz;i++)
      *(memblock+i) = 0;

memblock+i добавляет целое число i к указателю memblock. Результат указывает i элементов за пределы, где memblock указывает. Поскольку memblock является указателем на char, результат указывает i символов за пределы, где memblock указывает.

Тогда *(memblock+i) относится к символу по этому адресу. *(memblock+i) эквивалентно memblock[i]. *(memblock+i) = 0 устанавливает символ в ноль.

Таким образом, эффект этого кода - установить все символы, индексированные i во время цикла, на ноль. Очищает блок памяти.

for (i=0; i<=siz;i++) заставляет цикл повторяться с i, принимая все значения от нуля до siz включительно. Таким образом, siz + 1 символов будут установлены в ноль.

Мы видим, что это ошибка, поскольку get_argument выделяет 512 байт для argument, а затем вызывает clear_mem(argument, 512), что очищает 513 байт. Результирующее поведение не определяется кодом C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...