我知道缓冲区溢出是什么。但是我不知道缓冲区下溢是什么。
我猜这是当一个特定的缓冲区接收而不是字节溢出,字节下溢。
char buffer[8];
fgets(buffer, sizeof(buffer), stdin);
以上不会出错。
char buffer_overflow[8];
fgets(buffer_overflow, 16, stdin);
如果用户输入例如“deutschland”,则上述内容将导致缓冲区溢出。
我可以在代码中获得一个示例,缓冲区下溢是什么?
缓冲区下溢与缓冲区溢出没有直接关系。但是,缓冲区下溢可能是环形缓冲区等问题。
考虑例如音频播放:您的音频缓冲区可能是内核内存中某处的环形缓冲区。如果您写入数据的速度比音频驱动程序/硬件从缓冲区读取的速度慢,则缓冲区将变为空(“下溢”),从而导致音频卡顿。其他类型的实时数据处理和媒体播放也存在类似问题。
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).
我偶尔会听到这个术语用来指在缓冲区开始之前错误地读取。我不知道这个词的这种用法是否“正确”。
例如,考虑这个有缺陷的堆栈实现。
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)将导致函数读取数组的下限。