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/15 13:19:58

来了!老黄NVIDIA免费为clawdbot续命

来了&#xff01;老黄NVIDIA免费为clawdbot续命 前缘 如果说最近没玩clawdbot&#xff0c;是有点跟不上趟了。 但是当你跟上之后&#xff0c;有没有发现&#xff0c;tokens烧的肉疼&#xff1f; 别慌&#xff01; 老黄带着他的NVIDIA来免费续命了&#xff01; 注册NVIDA拿…

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

Flink Connector开发指南:自定义数据源与接收器

Flink Connector开发指南&#xff1a;自定义数据源与接收器 关键词&#xff1a;Flink、Connector、自定义数据源、接收器、数据流处理、分布式系统、实时计算 摘要&#xff1a;Apache Flink 作为流处理框架的标杆&#xff0c;其 Connector 体系是实现数据接入与输出的核心组件。…

作者头像 李华
网站建设 2026/6/9 7:50:55

BASE64格式图片储存到本地磁盘

使用高拍仪拍照&#xff0c;生成的图片是base64格式的图片&#xff0c;储存到数据库的时候占用的内存太大&#xff0c;所以将base64格式储存到本地。下面代码使用的是储存到本地的D:\upload\images\2026\2\2 这个是开发环境&#xff0c;如果是放到服务器的话&#xff0c;将D:\…

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

ESP32-S3对接豆包制作AI桌面数字收音机,桌面闹钟,桌面新闻播报器

ESP32-S3对接豆包制作AI桌面数字收音机&#xff0c;桌面闹钟&#xff0c;桌面新闻播报器 基于ESP32-S3开发板&#xff0c;对接豆包的AI能力&#xff0c;制作一款集数字收音机、桌面闹钟、新闻播报功能于一体的AI桌面设备&#xff0c;核心是实现ESP32-S3与豆包的网络交互&#x…

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

社会网络仿真软件:UCINET_(3).UCINET数据导入与导出

UCINET数据导入与导出 在社会网络分析中&#xff0c;数据的导入和导出是至关重要的步骤。UCINET提供了多种方法来处理数据&#xff0c;使其能够与其他软件和工具进行交互。本节将详细介绍UCINET中数据导入和导出的原理和方法&#xff0c;包括常见的数据格式、导入导出的操作步…

作者头像 李华