如何修复PC-Lint提示的无界scanf转换警告
修复PC-Lint无界scanf转换警告问题
问题背景
你使用的代码中存在无界的scanf系列函数调用:
int val; val = sscanf ( line_pointer, "%u,%u %s %s", &unit_id, &subprogram_id, flags.get(), slotDescriptionPtr.get() );
PC-Lint检测到另一段同类代码的风险并抛出警告:
warning 498: unbounded scanf conversion specifier '[' may result in buffer overflow
sscanf( value + 7, "%[/]/%[/]/%[^\n]", low, high, delta );
本质问题是%s和%[^xxx]这类转换符默认无长度限制,会持续读取直到遇到分隔符,若输入长度超过缓冲区容量,就会触发缓冲区溢出。
修复方案
给转换符添加明确的长度限制
这是最直接的修复方式,根据缓冲区的实际大小,在转换符前指定最大可读字符数(需预留1位给字符串终止符\0):- 针对你自己的代码(假设
flags缓冲区大小为32,slotDescriptionPtr缓冲区大小为128):int val; val = sscanf(line_pointer, "%u,%u %31s %127s", &unit_id, &subprogram_id, flags.get(), slotDescriptionPtr.get()); - 针对触发警告的代码(假设
low、high、delta缓冲区大小均为64):sscanf(value + 7, "%63[^/]/%63[^/]/%63[^\n]", low, high, delta);
- 针对你自己的代码(假设
改用更安全的输入处理函数
若场景允许,可替换为更可控的函数:- 使用C11标准的
scanf_s(需配合指定缓冲区大小参数,部分编译器支持); - 用
fgetc、strchr等函数手动解析输入字符串,完全控制读取长度; - 用
strtok_r按分隔符拆分字符串后,再逐个转换为目标变量,避免直接依赖sscanf的无界读取。
- 使用C11标准的
强制验证函数返回值
无论采用哪种修复方式,都要检查sscanf(或替代函数)的返回值,确认成功读取了预期数量的参数,避免因输入格式错误导致变量未初始化:int val = sscanf(line_pointer, "%u,%u %31s %127s", &unit_id, &subprogram_id, flags.get(), slotDescriptionPtr.get()); if (val != 4) { // 处理输入格式错误的情况 }
内容的提问来源于stack exchange,提问作者abssyz
相关产品推荐
相关产品推荐

