Переполнение буфера кучи - это ложное срабатывание средства очистки адресов?

У меня есть следующая простая программа

void copy(const int16_t *buffer) {
    int16_t *b;
    memcpy(b,buffer,2);
    return ;
}


int LLVMFuzzerTestOneInput(const int16_t *buffer) {
  copy(buffer);
  return 0;
}

который я компилирую с помощью clang (v9), используя флаги очистки адреса и фаззера следующим образом

clang -fsanitize=address,fuzzer -g test5.c

Когда я запускаю получившийся исполняемый файл, фаззер обнаруживает переполнение буфера кучи из-за неправильного чтения - в частности, при попытке скопировать второй байт в memcpy.

Я не могу понять, почему это ошибка. Есть объяснения? Заранее спасибо.

1 ответ

Поскольку b не инициализируется, когда вы запоминаете его, вы вызываете поведение undefined. Буквально "куда вы хотите скопировать эти данные?"

Дезинфицирующее средство подходит и делает вам большую услугу, указывая на эту проблему.

Для чего предназначена эта функция копирования?

Другие вопросы по тегам