嵌入式开发中的防御性C语言编程

本文介绍了嵌入式开发中防御性C语言编程的重要性,强调了对实参合法性、函数返回值、指针越界、数组越界、算术运算溢出和移位等潜在问题的检查。通过实例展示了如何避免除法运算溢出、整数运算溢出和指针操作的风险,并提出使用硬件看门狗作为最后防线。此外,还提出了关键数据备份和表决法来增强数据的可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌入式开发中的防御性C语言编程

\\\插播一条:文章末尾有惊喜哟~///

8979a6f2201c455f47a386de1c2851c9.png

嵌入式产品的可靠性自然与硬件密不可分,但在硬件确定、并且没有第三方测试的前提下,使用防御性编程思想写出的代码,往往具有更高的稳定性。

防御性编程首先须要认清C语言的种种缺少陷和陷阱,C语言对于运行时的检查十分弱小,须要程序员谨慎的考虑代码,在必要的时候增加判断;防御性编程的另一个核心思想是假设代码运行在并不可靠的硬件上,外接干扰有可能会打乱程序执行顺序、更改RAM存储数据等等。

1.具有形参的函数,需判断传递来的实参是否合法

程序员可能没意识的传递了错误参数;外界的强干扰可能将传递的参数修改掉,或者使用随机参数意外的调用函数,因此在执行函数主体前,须要先确定实参是否合法。

2.仔细检查函数的返回值

对函数返回的错误码,要进行全面仔细处理,必要时做错误记录。

3.防止指针越界

假如动态计算一个地址时,要保证被计算的地址是合理的并指向某个有意义的地方。特别对于指向一个构造或数组的内部的指针,当指针增加或者变更后依然指向同一个构造或数组。

4.防止数组越界

数组越界的问题前文已经讲述的很多了,由于C不会对数组进行有效的检测,因此必需在应用中显式的检测数组越界问题。下面的例子可用于中断接管通讯数据。

在使用一些库函数时,同样须要对边界进行检查,假如下面的memset(RecBuf,0,len)函数把RecBuf指指向的内存区的前len个字节用0填充,假如不注意len的长度,就会将数组RecBuf之外的内存区清零:

5.数学算数运算

5.1除法运算,只检测除数为零就可靠吗?

除法运算前,检查除数是否为零简直已经成为共识,但是仅检查除数是否为零就够了吗?

考虑两个整数相除,对于一个signed long类型变量,它能表示的数值范围为:-2147483648 ~+2147483647,假如让-2147483648/ -1,那么结果应该是+2147483648,但是这个结果已经超出了signedlong所能表示的范围了。所以,在这种情况下,除了要检测除数是否为零外,还要检测除法是否溢出。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值