当前位置: 首页 > news >正文

<span class=“js_title_inner“>review同事写的这段C代码有点小问题~</span>


正文


大家好,我是bug菌~

最近跟同事一起review代码,发现有一段似曾相识的C代码让我想起来一个bug,入行这么久断断续续在一些公司代码或者开源中遇到过多次这种编码,有些bug你看起来平平无奇,真正在编码过程中一不留神就容易踩坑了。

有些bug也不一定会立马表现出问题,就像越界也只是说有可能会篡改数据或者读到错数据,但在某个编译器某次自动编排内存的时候,所篡改的内存并没有用到,一切风平浪静,然而你的同事某一天需要加一个功能,才加几行毫不相干的代码,定义了几个变量,程序就莫名其妙的奔了,让他一脸懵~

1

bug

大家先不看后面的解析,读一遍代码看能不能立马看出这段代码潜在的风险:

#include <stdio.h> struct person { constchar *name; int id; }; staticconststruct person employees[] = { {"bug1", 1001}, {"bug2", 1002}, {"bug3", 1003}, }; void print_employees(void) { struct person *p = (struct person *)employees; while (p->name != NULL) { printf("Employee: %s (ID: %d)\n", p->name, p->id); p++; } } int main(void) { print_employees(); return0; }

2

分析

编写者期望当p->name为NULL时循环终止。然而,由于数组末尾没有显式的终止标志,循环将有可能越过数组边界,继续访问数组之后的内存区域大概率会崩溃,然而当恰巧遇到值为0的内存位置,循环意外终止,运行正常。

其实回味起来感觉就是挺简单的,正常情况下都自信满满不会写出这种的代码,但实际我在多份代码中都有遇到类似的问题。

要改这个问题当然就很简单了,显式的增加终止标志,行业内专业一点的叫法叫做哨兵元素,养成习惯了一般不会出问题。

static const struct person employees[] = { {"bug1", 1001}, {"bug2", 1002}, {"bug3", 1003}, {NULL, 0} // 明确的终止标志 };

也通常推荐大家再类似编程的时候,使用数组长度来进行管控,如:

void print_employees(void) { int count = sizeof(employees) / sizeof(employees[0]); for (int i = 0; i < count; i++) { printf("Employee: %s (ID: %d)\n", employees[i].name, employees[i].id); } }

最后

好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

唯一、永久、免费分享嵌入式技术知识平台~

推荐专辑 点击蓝色字体即可跳转

MCU进阶专辑

嵌入式C语言进阶专辑

“bug说”专辑

专辑|Linux应用程序编程大全

专辑|学点网络知识

专辑|手撕C语言

专辑|手撕C++语言

专辑|经验分享

专辑|电能控制技术

专辑 | 从单片机到Linux

http://www.jsqmd.com/news/334840/

相关文章:

  • 宏智树 AI 杀疯了!文献综述不用筛百篇文献,3 小时写出学术范
  • unique_ptr、shared_ptr、weak_ptr简易版实现记录
  • 社会网络仿真软件:UCINET_(12).动态网络分析
  • tls1.2的密钥派发相关
  • iPhone SE 第二代:A13 小钢炮深度解析|配色外观|核心参数|二手验机避坑清单
  • 社会网络仿真软件:UCINET_(13).UCINET高级功能
  • 乔尔·格林布拉特的价值投资实践指南
  • iPhone 12 mini:小屏旗舰深度解析|配色外观|核心参数|维修手册解读|二手验机避坑清单(图文版)
  • 2026届毕业生必看:实测5个免费降ai率工具推荐,降低ai率更轻松(降AI工具避坑指南)
  • 魔塔游戏设计笔记
  • 寒假第十一天
  • 软件架构全景图:从设计范式到演进策略的深度指南
  • X开源推荐算法或威胁匿名账户隐私安全
  • WebGL跨端兼容实战:移动端适配全攻略
  • 提示系统负载均衡设计:架构师如何通过负载策略提升提示服务的稳定性
  • 论文AIGC痕迹太重?实测5个免费降ai率工具推荐,2026届毕业生必看!降低ai率更轻松
  • 贪心构造+枚举子集+有向图判环
  • 社会网络仿真软件:UCINET_(10).网络演化模型
  • 实测5个免费降ai率工具推荐,还有免费ai查重!降低ai率更轻松(2026届毕业生必看!)
  • 555555
  • 架构思维的精髓:在解构与集成间驱动数字化演进
  • Kubernetes 基于sealos和nerdctl实现镜像管理
  • 333333
  • 留心短期相聚这些细节,爸妈记性变差、迷路可能是老年痴呆症前兆表现 - 资讯焦点
  • BASE64格式图片储存到本地磁盘
  • 解锁免疫潜能:B 细胞活化的 “黄金密钥”
  • AI原生应用领域多租户技术的创新实践
  • 社会网络仿真软件:UCINET_(8).结构洞与社会资本分析
  • React Native for OpenHarmony:构建高性能、高体验的 TextInput 输入表单
  • 社会网络仿真软件:UCINET_(9).结构洞与社会资本