如何解决PC-Lint缓冲区溢出警告及无边界scanf转换问题
解决PC-Lint缓冲区溢出与无边界scanf转换警告
问题根源
你当前的格式字符串构造逻辑错误:"%u,%u %1%s %2%s"经arg(length+1)替换后会生成类似"%u,%u 10%s 10%s"的格式串。这会让sscanf先尝试读取一个整数(比如10),再读取无边界的%s,完全没起到限制字符串长度的作用,所以PC-Lint依然会抛出「无边界scanf转换」警告,同时存在缓冲区溢出风险。
修复方案
正确的做法是将长度限制直接整合到%s格式符中,即使用%Ns(N为最大读取字符数,不包含终止符)。由于你的缓冲区大小是length+1,最多可读取length个字符(留1位存\0),因此修改格式串构造逻辑如下:
val = sscanf(line_pointer, QString("%u,%u %1s %2s").arg(length).arg(length).toStdString().c_str(), &unit_id, &subprogram_id, flags.get(), slotDescriptionPtr.get());
额外注意事项
- 检查返回值:务必校验
sscanf的返回值val,只有当val == 4时,才说明四个参数都成功匹配,否则需处理输入格式错误的情况,避免未初始化的变量引发问题。 - 空字符串处理:如果
item_as_string为空,length为0,此时%0s会让sscanf读取0个字符,缓冲区仅存\0,逻辑安全,但可提前判断空输入,直接返回错误提示。 - 类型匹配:确认
unit_id和subprogram_id是unsigned int,%u格式符与其类型匹配,避免类型不匹配导致的未定义行为。
内容的提问来源于stack exchange,提问作者abssyz
相关产品推荐
相关产品推荐

