news 2026/2/12 11:20:18

<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/2/11 10:06:14

模拟Clade Code的Skills机制的demo代码

Skills Runtime GitHub:https://github.com/crisschan/mini_skills_runtime 本地 Skill 执行运行时 - 完全对齐 Claude Code 的 Skills 组织方式 特性 Skill 定义: 通过 SKILL.md 定义 Skill,支持结构化指令、输入输出、安全配置 Skill 路由: 基于关键词匹配的智能路由系统…

作者头像 李华
网站建设 2026/2/11 7:20:16

06. 信号源讲解(六)---VSFFM、ISFFM篇 I PSpice高级应用

今天分享的是在电路仿真中模拟调频信号的重要工具&#xff1a;PSpice中的单频调频信号源&#xff08;VSFFM / ISFFM&#xff09;。它能帮助我们生成频率随时间按正弦规律变化的信号&#xff0c;常用于模拟通信系统、测试滤波器响应或分析锁相环等电路的性能。 简单来说&#x…

作者头像 李华
网站建设 2026/2/10 19:08:07

社会网络仿真软件:UCINET_(4).数据准备与导入

数据准备与导入 在进行社会网络分析之前&#xff0c;首要步骤是准备好数据并将其导入到UCINET中。数据准备涉及数据的收集、清洗和格式化&#xff0c;而数据导入则是将准备好的数据加载到UCINET中以便进行进一步的分析。本节将详细介绍这两个步骤&#xff0c;并提供具体的例子…

作者头像 李华
网站建设 2026/2/11 7:20:14

Flutter for OpenHarmony 实战:投票管理系统完整开发指南

Flutter for OpenHarmony 实战&#xff1a;投票管理系统完整开发指南 文章目录 Flutter for OpenHarmony 实战&#xff1a;投票管理系统完整开发指南摘要一、项目背景与功能概述1.1 投票系统的应用场景1.2 应用功能规划1.3 投票规则说明 二、投票系统设计原则2.1 用户界面设计2…

作者头像 李华
网站建设 2026/2/11 7:20:11

终于有人愿意把 SPC 精益本质讲透了

搞生产&#xff0c;做质量&#xff0c;SPC 这三个字听得耳朵起茧。报表没少做&#xff0c;图没少画&#xff0c;真到出了问题&#xff0c;该乱的还是乱。问题出在哪&#xff1f;很多人把 SPC 当数学题&#xff0c;当上级任务&#xff0c;偏偏忘了它最该是什么——一套让过程自己…

作者头像 李华