微控制器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
相关产品推荐
相关产品推荐

