主要内容

字符串操作中目标缓冲区下溢

函数从缓冲区起始位置的负偏移处写入缓冲区

描述

当某些字符串操作函数以缓冲区开头的负偏移量写入其目标缓冲区参量时,会出现此缺陷。

例如,对于函数 sprintf(char* buffer, const char* format),您可以从运算 buffer = (char*)arr; ... buffer += offset; 中获得 bufferarr 是一个数组,offset 是一个负值。

风险

缓冲区下溢可能导致意外行为,例如内存损坏或停止系统。缓冲区下溢还会引入了代码注入的风险。

修复

如果目标缓冲区参量来自指针算术,请查看您是否正在递减指针。通过修改递减前的原始值或递减值来修复指针递减。

示例

全部展开

#include <stdio.h>
#define offset -2

void func(void) {
    char buffer[20];
    char *fmt_string ="Text";

    sprintf(&buffer[offset], fmt_string);     
}

在此示例中,&buffer[offset] 与分配给 buffer 的内存处于负偏移量。

更正 - 更改指针递减项

一种可能的更正方法是更改 offset 的值。

#include <stdio.h>
#define offset 2

void func(void) {
    char buffer[20];
    char *fmt_string ="Text";

    sprintf(&buffer[offset], fmt_string);     
}

结果信息

组:静态内存
语言:C | C++
默认值:手写代码时为启动,生成代码时为关闭
命令行语法:STRLIB_BUFFER_UNDERFLOW
影响

版本历史记录

在 R2015b 中推出