news 2026/6/15 0:03:11

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 21:18:21

社会网络仿真软件:UCINET_(10).网络演化模型

网络演化模型 在网络分析中&#xff0c;网络演化模型是一种重要的工具&#xff0c;用于模拟和分析网络结构随时间变化的过程。这些模型可以帮助我们理解网络中的动态行为&#xff0c;预测未来的变化趋势&#xff0c;并为决策提供依据。UCINET 提供了多种方法来构建和分析网络演…

作者头像 李华
网站建设 2026/5/21 19:32:27

AI原生应用领域多租户技术的创新实践

AI原生应用领域多租户技术的创新实践 关键词&#xff1a;AI原生应用、多租户技术、资源隔离、动态调度、数据隐私 摘要&#xff1a;本文围绕AI原生应用中的多租户技术展开&#xff0c;从核心概念到实战落地&#xff0c;结合生活案例与技术细节&#xff0c;深入解析多租户技术如…

作者头像 李华
网站建设 2026/6/13 9:57:41

555555

555555

作者头像 李华
网站建设 2026/6/10 15:40:14

社会网络仿真软件:UCINET_(8).结构洞与社会资本分析

结构洞与社会资本分析 1. 结构洞的定义与重要性 结构洞&#xff08;Structural Holes&#xff09;是指在社会网络中&#xff0c;两个或多个节点之间没有直接的连接&#xff0c;但通过一个中介节点间接相连。这些中介节点在信息、资源和机会的传递中扮演着关键角色&#xff0c…

作者头像 李华
网站建设 2026/6/13 17:20:06

宏智树 AI 太懂论文党!零代码搞定数据分析,小白也能写硬核实证

作为深耕论文写作科普的博主&#xff0c;每天都能收到粉丝的 “数据分析崩溃求助”&#xff1a;“Stata 代码看半天看不懂&#xff0c;实证章节卡了 1 周”“面板数据不知道选什么模型&#xff0c;怕选错题全白费”“回归结果出来了&#xff0c;却不会用学术语言解读”。其实数…

作者头像 李华