Подтвердить что ты не робот

C: Что такое пример переполнения буфера?

Я знаю, что такое переполнение буфера. Я даже не знаю, что такое переполнение буфера.

Я предполагаю, что это когда конкретный буфер получает вместо переполнения байтов, нижнего байта байтов.

char buffer[8];
fgets(buffer, sizeof(buffer), stdin);

Вышеизложенное не даст ошибок.

char buffer_overflow[8];
fgets(buffer_overflow, 16, stdin);

Приведенное выше приведет к переполнению буфера, если пользовательский ввод был, например, "deutschland".

Могу ли я получить пример кода, что такое переполнение буфера?

4b9b3361

Ответ 1

Недопустимое переполнение буфера не связано непосредственно с переполнением буфера. Однако переполнение буфера может быть проблемой, например. кольцевые буферы.

Рассмотрим, например, воспроизведение звука: ваш звуковой буфер, вероятно, является кольцевым буфером где-то в памяти ядра. Если вы записываете данные медленнее, чем аудио-драйвер/аппаратное обеспечение читает из буфера, буфер становится пустым ( "underflows" ), что приводит к заиканию звука. Аналогичные проблемы существуют и для других видов обработки данных в реальном времени и воспроизведения мультимедиа.

Таким образом, переполнение буфера часто не является условием сбоя как таковое (в отличие от переполнения буфера, что обычно заставляет программы выполнять undefined, нежелательное поведение, такое как завершение, выполнение какого-либо нежелательного кода и т.д.).

Ответ 2

Я иногда слышал, что термин используется для обозначения ошибочного чтения перед началом буфера. Я не знаю, является ли это использование слова "правильным".

В качестве примера рассмотрим эту ошибочную реализацию стека.

struct fixed_size_stack
{
  int top;
  int data[128];
};

int
fixed_size_stack_pop(struct fixed_size_stack * this)
{
  return this->data[--(this->top)];
}

Отсутствующая проверка для if (this->top > 0) заставит функцию читать нижнюю границу массива, если запрашивается поп из уже пустого стека.

Ответ 3

Есть несколько примеров в PVS V512. Я получил проблему в gearmad в отрывке:

  pollfd fds[2];
  ...
  memset(fds, 0, sizeof(pollfd));

Ответ 4

Я знаю, что слишком поздно ответить на этот вопрос. Все предыдущие ответы удовлетворительные, я просто думаю, что пример будет иметь смысл.

#include<stdio.h>
int main(){
    unsigned int u=-1;
    printf("%u",u);
    return 0;
}

Output: 4294967295

Это простой пример переполнения кольцевого буфера. Мы знаем, что unsigned int не может представлять отрицательные значения. Однако, если мы назначим -1 to u, значение в u теперь 4294967295. Это 2^32 -1, что является самым высоким значением, которое может хранить unsigned int. Сохранение значения ниже самого низкого дает вам самое высокое значение. Это недостаток. Надеюсь, это поможет.