18

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

我猜这是当一个特定的缓冲区接收而不是字节溢出,字节下溢。

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

以上不会出错。

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

如果用户输入例如“deutschland”,则上述内容将导致缓冲区溢出。

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

4

3 回答 3

21

缓冲区下溢与缓冲区溢出没有直接关系。但是,缓冲区下溢可能是环形缓冲区等问题。

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

Thus a buffer underflow is often not a fault condition per se (unlike a buffer overflow, which usually causes programs to perform undefined, unwanted behaviour like termination, executing some unwanted code and so on).

于 2014-10-08T13:08:30.983 回答
7

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

例如,考虑这个有缺陷的堆栈实现。

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)将导致函数读取数组的下限。

于 2014-10-08T13:18:45.803 回答
0

There are some examples in PVS V512. I got the issue in gearmad implementation in snippet:

  pollfd fds[2];
  ...
  memset(fds, 0, sizeof(pollfd));
于 2017-06-01T09:31:39.310 回答