You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:48:22