C:什么是缓冲区下溢的例子?

时间:2014-10-08 13:04:43

标签: c underflow

我知道缓冲区溢出是什么。我不知道缓冲区下溢是什么

我猜这是特定缓冲区收到而不是字节溢出,字节下溢。

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

上述情况不会出错。

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

如果用户输入是例如" deutschland"上面会导致缓冲区溢出

我可以在代码中获得一个示例,缓冲区下溢是什么?

4 个答案:

答案 0 :(得分:19)

缓冲区下溢与缓冲区溢出无直接关系。然而,缓冲器下溢可能是例如问题。环缓冲区。

考虑例如音频播放:您的音频缓冲区可能是内核内存中的某个环形缓冲区。如果写入的数据比从缓冲区读取的音频驱动程序/硬件慢,则缓冲区变空("下溢"),导致音频卡顿。其他类型的实时数据处理和媒体播放也存在类似的问题。

因此缓冲区下溢本身通常不是故障条件(与缓冲区溢出不同,缓冲区溢出通常会导致程序执行未定义的,不需要的行为,如终止,执行一些不需要的代码等等。)

答案 1 :(得分:5)

我偶尔会听到这个词用来指在缓冲区开头之前错误地读取。我不知道这个词的用法是否“正确”。

举个例子,考虑一下这个有缺陷的堆栈实现。

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)的缺失检查将导致函数读取数组的下限,如果请求已经空堆栈的弹出。

答案 2 :(得分:0)

PVS V512中有一些例子。我在代码段gearmad实现中遇到了问题:

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

答案 3 :(得分:-4)

我知道现在回答这个问题已经太晚了。之前的所有答案都令人满意,我只是觉得一个例子会更有意义。

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

Output: 4294967295

这是环形缓冲区下溢的一个简单示例。我们知道unsigned int不能代表负值。但是,如果我们将-1分配给u,则u中的值现为4294967295。这是2^32 -1,这是unsigned int可以存储的最高值。存储值低于最低产量的最高值。这是下溢。希望这会有所帮助。