如何提高C语言代码质量?

Posted 嵌入式软件开发学习圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提高C语言代码质量?相关的知识,希望对你有一定的参考价值。

关注“嵌入式软件学习圈”免费获取更多学习教程 

防止有符号整数溢出

整数溢出是一种常见、难预测且严重的软件漏,由它引发的程序Bug可能比格式化字符串与缓冲区溢出等缺陷更难于发现。C99 标准中规定,当两个操作数都是有符号整数时,就有可能发生整数溢出,它将会导致“不能确定的行为”。

也就是说整数溢出是一种未定义的行为,这也就意味着编译器在处理有符号整数的溢出时具有很多的选择,遵循标准的编译器可以做它们想做的任何事,比如完全忽略该溢出或终止进程。大多数编译器都会忽略这种溢出,这可能会导致不确定的值或错误的值保存在整数变量中

整数溢出有时候是很难发现的,一般情况下在整数溢出发生之前,你都无法知道它是否会发生溢出,即使你的代码经过仔细审查,有时候溢出也是不可避免的。因此,程序很难区分先前计算出的结果是否正确,而且如果计算结果将作为一个缓冲区的大小、数组的下标、循环计数器与内存分配函数的实参等时将会非常危险。当然,因为无法直接改写内存单元,所以大多数整数溢出是没有办法利用的。但是,有时候整数溢出将会导致其他类型的缺陷发生,比如很容易发生的缓冲区溢出等。示例如下:

如何提高C语言代码质量?(六)

在32位操作系统中,类型int的取值范围为“-2147483647 ~ 2147483647"

而在代码清单1-13中,当程序执行语句“s1+s4 、s2-s3 与s2*s5”时,其结果都超过类型int的取值范围,因此发生溢出行为。

如何提高C语言代码质量?(六)

当然,面对这些简单的有符号整数运算溢出,简单地通过对操作数进行预测的方法就能够避免发生有符号整数运算溢出。比如,代码清单就采用了补码的表示形式来对操作数进行预测。

如何提高C语言代码质量?(六)

如何提高C语言代码质量?(六)

如上面的代码所示,这种方式可以有效地避免发生简单的有符号整数运算溢出,有兴趣的朋友可以自己测试。其实,不只算术运算可能造成溢出,任何企图改变该有符号整型变量值的操作都可能造成溢出。

如何提高C语言代码质量?(六)

与无符号整数的回绕相似,并不是每种运算符号都会令有符号操作数运算产生溢出,

表给出了可能会导致溢出的操作符。

如何提高C语言代码质量?(六)

在代码清单中,程序需要将cl与c2的内容复制到buf中,并分别由lenl与len2来指定复制的字节数。这里需要特别注意的语句是“if((lenl + len2)> 100)",我们利用该语句进行了相对严格的大小检查:如果len1 + len2的值大于buf数组的大小( 100),则不进行复制。

运行代码清单,当我们执行命令“1-16 Hello! 6C2”时,程序运行正常,并成功地将字符串复制到buf中。

可当我们执行命令“1-16 Hello! 2147483647 C 2”时,程序却意外地绕过大小检查语句“if(len1 + len2)> 100)”来执行相关的操作。是什么原因导致这种情况发生的呢?

其实很简单,就是由于整数溢出而导致的。从执行的命令“1-16 Hello! 2147483647 C 2”可以得出,lenI 的值为2147483647 (即十六进制为0xfffff) len2 值为2 (即十六进制为0x00000002).当执行语句“len1 + len2 (即0rx7ffff0000000 )"时会发生溢出,所得结果为-2147483647 (即十六进制为0x80000001 )。因为-2147483647远远小于100,从而使程序绕过大小检查语句“if(lenl + len2)> 100)”来执行余下的操作。


如何提高C语言代码质量?历史消息







汽车电子入门历史消息

汽车电子控制技术入门(十) 主要讲述:ECU硬件软件的开发流程,以及控制过程包括:开环,闭环控制,链接为:


汽车电子控制技术入门(九) 主要讲述:氧传感器功用, 氧传感分类氧化锆(ZrO2)氧化钛(TiO2)氧化锆式氧传感器和氧化钛式氧传感器 工作原理,链接为:


汽车电子控制技术入门(八) 主要讲述:电子控制系统的组成、曲轴位置传感器工作原理、凸轮轴位置传感器(磁感式、霍尔式、光电式)工作原理,链接为:


汽车电子控制技术入门(七) 主要讲述:电动燃油泵、燃油分配管、燃油压力调节器、喷油器等组成以及其工作原理 链接为:


汽车电子控制技术入门(六) 主要讲述:燃油供给系统的组成、电动燃油泵的工作原理。链接为:


汽车电子控制技术入门(五) 主要讲述:温度传感器的组成分类,以及工作原理。链接为:


汽车电子控制技术入门(四) 主要讲述:空气式流量传感器的分类以及工作原理,节气门位置传感器的组成和工作原理。链接为:


汽车电子控制技术入门(三) 主要讲述:发动机电子控制系统,电子控制燃油喷射系统的分类和基本组成,空气供给系统的组成和工作原理。链接为:


汽车电子控制技术入门(二) 主要讲述:汽车电子控制技术的发展趋势,1、控制系统集成化,2、信息传输网络化,3、汽车和交通智能化,4、电控系统设计模块化,以及介绍了汽车电控系统的基本组成:传感器、执行器、ECU.链接为:


汽车电子控制技术入门(一) 主要讲述:汽车电子控制技术的发展,以及三个发展阶段:模拟电子电路阶段,微型计算控制阶段,车载局域网控制阶段。链接为:




 

 


以上是关于如何提高C语言代码质量?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高C语言代码质量?

如何提高C语言代码质量?

C语言编程代码好坏如何判断

静态函数库的制作和使用

每周一书-编写高质量代码:改善C程序代码的125个建议

如何保障Go语言基础代码质量?