尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

代码审查抓出三个隐藏bug:NaN漏洞、掩码溢出、死字段

代码审查抓出三个隐藏bug:NaN漏洞、掩码溢出、死字段 一句话: 正常运行测不出来的 bug代码审查一眼看穿Flash 读出 NaN 逃过范围判断、换算值 4096 被 12 位掩码变成 0、只有读写没有使用的半成品变量。审查找三样比较逻辑漏洞、边界溢出、没人用的字段。适合谁读想用代码审查找隐藏 bug、写防御式代码的嵌入式工程师。背景一轮代码审查三个高优先级 bug对固件做了一轮全面代码审查抓到几个平时正常跑测不会暴露的高优先级 bug。这种 bug 的共同点不触发则已触发就是大事全新设备首上电、高温环境、特殊操作路径。Bug 1Flash 读出 NaN范围判断形同虚设Flash 擦除后全 0xFF当 float 读出来是 NaN。而默认值加载的判断是if (flag 0.999F || flag 1.001F) { 加载默认值; }问题NaN 和任何数比较都是 false——NaN 0.999是 falseNaN 1.001也是 false。if 不成立默认值永远不会加载NaN 系数一路传播到所有计算。全新设备首次上电就踩读出来全 NaN标定系数全是非数输出乱套。修复加上 NaN 自比较检查if (flag ! flag || flag 0.999F || flag 1.001F) { 加载默认值; }flag ! flag只有 NaN 时为真——这是 C 里检测 NaN 的标准写法不需要数学库函数。Bug 2掩码把 4096 变成 0温度换算成 DAC 码70°C 时算出 4096。写入函数内部有一行保护data 0x0FFF // 12位掩码: 4096 0x0FFF 04096 恰好是 12 位能表示的最大值加 1——掩码之后变成 0。结果70°C 被写成了最低温。高温设备越热显示越冷。修复换算后先限幅再掩码if (code 4095) code 4095; // 限幅教训掩码/限幅要覆盖边界值。12 位数据所以 0x0FFF这个习惯本身没错但边界上的 4096 就漏了。Bug 3死字段——只有读写、没有使用协议里有个命令读写一个变量看起来一切正常。但全工程没有任何代码真正使用它——设了通道不生效是个半成品。这类 bug 最隐蔽有读写、有回显、协议文档有定义就是没有用。上位机设了值设备不响应排查半天。修复把命令改接真实生效的变量。怎么找审查的三个抓手抓手找什么本文例子比较逻辑漏洞可能为 NaN/异常的值参与比较Flash 读出 NaN 逃过范围判断边界溢出刚好超过表示范围的换算值4096 被 12 位掩码变 0死代码只有读写、没人使用的变量/函数半成品通道变量经验凡是可能从 Flash/未知源来的 float先做 NaN 检查——x ! x一行代码防的是系数全是 NaN 的灾难掩码/限幅要覆盖边界值——4096 恰好溢出 12 位高温变低温代码审查要找只有自己读写、没人使用的字段——那是半成品。审查时多问一句这个变量谁在用实测对比正常跑测三个bug从未触发 | 代码审查一眼看穿NaN漏洞/掩码溢出/死字段有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。下一篇嵌入式开发常用英语缩写汇总查表即用——遇到不认识的缩写直接查
返回列表