news 2026/8/21 22:51:57

[技术讨论] 【C语言实战经验6】什么是防御式编程?请看代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[技术讨论] 【C语言实战经验6】什么是防御式编程?请看代码

为什么会有防御式编程呢?其实防御式编程的概念来源于防御式驾驶思维,因为你不知道也无法确定司机下一步要做什么,那怎么样才能保证司机在做出危险动作的时候自己不会受到伤害呢?这个时候就需要自己承担自我保护责任,就算是他人过错;所以,防御式编程的主要思想就是不能因外部的错误数据而破坏程序的正常运行。

另外,防御式编程其实也算一种软件开发的方法,通过预判和处理潜在错误来防止程序崩溃或者产生不可预知的行为,从而达到提高代码安全性和健壮性的目的。

那到底都有哪些防御式编程的代码操作呢?我们一起来看看吧!

1、函数入参验证

在定义和编写函数时,会经常接触到函数形参,有时候函数形参或者形参之间会有值范围和一些特殊性存在,有些实参值是不能作为形参输入的,一旦输入错误数据,那可能就会出现问题。

比如自定义了一个有符号数的除法运算函数,形参1为被除数dividend,形参2为除数divisor,形参3为商quotient(输出结果)。最简单的代码实现就是如下:

复制

  1. void divide(int dividend, int divisor, int *quotient)
  2. {
  3. *quotient = dividend / divisor;
  4. }

那如何增加防御式代码呢?

大家都知道,除数不能为0,要对除数执行非零判断,如下所示:

复制

  1. int divide(int dividend, int divisor, int *quotient)
  2. {
  3. // 检查除数是否为0
  4. if (0 == divisor)
  5. {
  6. return -1; // 错误代码
  7. }
  8. *quotient = dividend / divisor;
  9. return 0; // 成功
  10. }

2、指针安全检查

自定义函数时,函数入参类型用指针类型是非常常见的操作,但是相比其他基本数据类型而言,指针又是最容易出问题的,包括空指针和野指针在内往往都是导致程序崩溃的罪魁祸首。

因此,函数入参使用指针类型时,一定要先进行指针的安全性检查。

如下代码,先检查指针变量dest和src是否为NULL(空),如果为NULL,则直接返回,不执行拷贝操作。

复制

  1. void copy(char *dest, const char *src, size_t dest_size)
  2. {
  3. // 检查指针是否为NULL
  4. if (NULL == dest || NULL == src)
  5. {
  6. return;
  7. }
  8. // 确保目标缓冲区足够大
  9. size_t src_len = strlen(src);
  10. if (src_len >= dest_size)
  11. {
  12. src_len = dest_size - 1;
  13. }
  14. // 安全拷贝
  15. strncpy(dest, src, src_len);
  16. dest[src_len] = '\0'; // 确保字符串终止
  17. }

3、边界检查

有时候我们定义的函数的入参是有特殊的实际意义的,比如阈值范围、数组长度和协议命令码等,如果实际输入的数值不在合理范围内,即超出了边界,那就要执行异常返回处理。

比如一个根据ADC数据计算电量的函数,ADC的正常范围是100~2000,那我们就可以按如下方式增加防御式编程,以避免输出异常的电量数据:

复制

  1. #define ADC_VALUE_MIN (100)
  2. #define ADC_VALUE_MAX (2000)
  3. int cal_volatge(unsigned int adc_data)
  4. {
  5. //判断ADC数据是否在合理范围内
  6. if((adc_data < ADC_VALUE_MIN) || (adc_data > ADC_VALUE_MAX))
  7. {
  8. return -1;
  9. }
  10. //计算电压
  11. return 0;
  12. }

4、断言处理

断言(assertion)是一种在程序中的一阶逻辑(如一个结果为真或假的逻辑判断式),目的是为了表示与验证软件开发者预期的结果。

断言处理在STM32的固件库里其实是非常常见的,会对一些入参进行检查:

当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。

C标准库里有一个assert.h头文件,该头文件常用于防御式编程,其中提供了一个assert宏,它只带一个参数,通过布尔表达式的方式描述一些非预期错误,包括空指针、输入输出参数值不在合理范围及数组越界等。

比如下面的代码通过断言判断指针是否为NULL:

复制

  1. void set_int_array_value(IntArray *arr, size_t index, int value)
  2. {
  3. //使用断言检查内部不变式
  4. assert(arr != NULL);
  5. // 运行时检查
  6. if (index >= arr->size)
  7. {
  8. return;
  9. }
  10. arr->data[index] = value;
  11. }

以上通过几个实际的常用的代码demo介绍了防御式编程的基本内容,其实防御式编程还涉及其他内容,简单总结如下:

验证所有输入:包括用户输入、文件内容和函数参数等;

检查返回值:特别是内存分配、文件操作等可能失败的调用;

使用断言:验证程序内部不变式;

初始化变量:特别是指针和敏感数据;

边界检查:数组访问、循环条件等;

资源管理:确保分配的资源最终被释放,原则就是谁申请谁释放;

错误处理:提供有意义的错误信息并处理错误;

代码审查:代码走查,代码走读,多人检查代码中的潜在问题;

静态分析:使用工具检测潜在问题,包括语法错误等。

通过以上这些防御式编程的操作和实践,将会显著提高代码的安全性和健壮性,有望彻底告别软件死机问题。


---------------------
作者:dffzh
链接:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3458784
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

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

AI论文写作助手推荐:8个网站性能对比,降重与创作功能详解

在众多AI论文工具中&#xff0c;选择一款适合自己需求的平台可能令人眼花缭乱。本文将对比8款热门工具&#xff0c;重点聚焦降重、降AIGC率、写论文等功能。工具排名基于实测数据和用户反馈&#xff0c;确保客观实用性。以下是简要排行表&#xff08;基于效率、准确性和易用性&…

作者头像 李华
网站建设 2026/8/21 7:42:48

毕业季救星!7 个 AI 论文工具,帮你把论文 “难” 变 “秒通关”

毕业季的论文 Deadline 越逼越近&#xff0c;你是不是还在 “选题卡 3 天、文献查一周、大纲改到崩溃”&#xff1f;别慌 —— 从Paperzz到 6 个宝藏 AI 工具&#xff0c;直接把论文写作的 “hard 模式” 调成 “easy 模式”&#xff0c;每一个都精准戳中论文痛点&#xff01; …

作者头像 李华
网站建设 2026/8/21 22:16:59

CC2530运行ZStack时的中断处理机制解析

CC2530运行ZStack时的中断处理机制解析&#xff1a;从硬件到协议栈的实时协同 在物联网系统中&#xff0c; “及时响应”往往比“强大算力”更重要 。尤其是在ZigBee这类低功耗无线网络里&#xff0c;一个微秒级的延迟就可能导致信道竞争失败、数据包丢失&#xff0c;甚至引发…

作者头像 李华
网站建设 2026/8/21 9:21:46

树莓派5首次使用:操作指南与避坑建议

树莓派5上手全记录&#xff1a;从开箱到稳定运行的实战经验 刚拿到树莓派5时&#xff0c;我满心期待——更强的CPU、更快的内存、终于来了的PCIe接口。可第一次通电后&#xff0c;屏幕没亮&#xff1b;第二次烧卡成功却频繁重启&#xff1b;第三次风扇狂转但温度居高不下……这…

作者头像 李华
网站建设 2026/8/21 11:52:54

Node.js 原生功能狂飙,15 个热门 npm 包要失业了

大家好&#xff0c;我是 Immerse&#xff0c;一名独立开发者、内容创作者、AGI 实践者。 关注公众号&#xff1a;沉浸式趣谈&#xff0c;获取最新文章&#xff08;更多内容只在公众号更新&#xff09; 个人网站&#xff1a;https://yaolifeng.com 也同步更新。 转载请在文章…

作者头像 李华