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

如何修复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的无界读取。
  • 强制验证函数返回值
    无论采用哪种修复方式,都要检查sscanf(或替代函数)的返回值,确认成功读取了预期数量的参数,避免因输入格式错误导致变量未初始化:

    int val = sscanf(line_pointer, "%u,%u %31s %127s", &unit_id, &subprogram_id, flags.get(), slotDescriptionPtr.get());
    if (val != 4) {
        // 处理输入格式错误的情况
    }
    

内容的提问来源于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 19:28:22