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

微控制器C语言解析BG96固件版本号时firmwareVersion出现垃圾值问题

问题原因排查
  • 偏移地址计算错误:你已经通过strstr拿到了匹配到Revision:的指针ret,但复制时仍使用tempdata+9作为源地址,只有Revision:刚好出现在tempdata最开头时这个偏移才正确,一旦tempdata开头有其他应答内容,复制的就是完全无关的数据,自然会出现垃圾值。
  • 数组越界操作:你定义的firmwareVersion数组长度为24,合法下标范围是0~23,代码中firmwareVersion[sizeof(firmwareVersion)] = '\0'实际访问了下标24的越界地址,会破坏栈上数据,也会导致字符串结束符位置错误。
  • strncpy参数使用不当:strncpy第三个参数是最大可复制字节数,直接传24的话如果版本号长度超过23,strncpy不会自动补结束符,即使后续补结束符也已经发生了内容截断或越界。
  • 隐藏逻辑漏洞:原代码在ret匹配成功的分支没有写返回语句,函数结束后返回值是随机值,属于未定义行为。
正确实现代码
signed char updateBG96FirmwareVersion(int timeout)
{
    char firmwareVersion[24];
    char *ret = NULL;
    const char *prefix = "Revision:";
    size_t prefix_len = strlen(prefix);

    if (GSMCommand("I", tempdata, timeout) != AT_OK)
        return FEHLER;

    ret = strstr(tempdata, prefix);
    if (ret == NULL)
        return FEHLER;
    
    // 跳过硬编码前缀和后面的空白字符
    char *version_start = ret + prefix_len;
    while (*version_start == ' ' || *version_start == '\t') {
        version_start++;
    }
    // 最多复制23个字符,预留1位存储结束符
    strncpy(firmwareVersion, version_start, sizeof(firmwareVersion)-1);
    // 强制在最后一位补结束符,避免字符串无终止
    firmwareVersion[sizeof(firmwareVersion)-1] = '\0';

    return AT_OK;
}

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:06:03