0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

代码防御性编程不得不知的技巧

Q4MP_gh_c472c21 来源:C语言与CPP编程 作者:自成一派123 2021-11-22 09:49 次阅读

1 什么是防御性编程?顾名思义,防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能的”保护”自己。我们通过明确地在代码中对设想进行检查,这是一种努力,防止我们的代码以将会展现错误行为的方式被调用。

防御性编程使我们可以尽早的发现较小的问题,而不是等到它们发展成大的灾难的时候才发现。其开发软件的过程是:

下面总结了一些防御性编程的反对和支持者的意见:

反对者:

它降低了代码的效;即使是一个很小的额外代码也需要一些额外的执行时间。它对于一个函数来说也许不要紧,但是对于一个由10万个函数组成的系统,问题就变得严重了。

每种防御性的做法都需要一些额外的工作;

支持者:

防御性编程可以节省大量的调试时间,使你可以去做更有意义的事情。

编写可以正常运行、只是速度有些慢的代码,要远远好过大多数时间都正常运行、但是有时候会崩溃的代码。

防御性编程避免了大量的安全性问题。

防御性编程技巧使用好的编码风格和合理的设计

采用良好的编码风格,来防范大多数编码错误。如:

const关键字:

关键字const可以给读你代码的人传达非常有用的信息。例如,在函数的形参前添加const关键字意味着这个参数在函数体内不会被修改,属于输入参数。

同时,合理地使用关键字const可以使编译器很自然的保护那些不希望被修改的参数,防止其被无意的代码修改,减少bug的出现。

volatile关键字:

在一些并行设备的硬件寄存器(如状态寄存器),中断服务子程序中会访问到的全局变量以及多线程应用中被几个任务共享的变量前使用volatile关键字来防止编译优化。

static关键字:

函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。

在模块内的static全局变量可以被模块内的所有函数访问,但不能被模块外其它函数访问。

在模块内的static函数只可能被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内。

位操作运算中,尽可能使用《《、 》》、 &、|等运算符,尽可能少使用/、%、*运算符。

变量和函数的命名要有意义,并且尽可能做到一个函数只做一件事情。

多采用面向对象的思想来编写代码。

在投入到编码工作之前,先考虑大体的设计方案,这也非常关键。

不要仓促的编写代码

欲速则不达,每敲一个字,都要想清楚你要输入的是什么。在写每一行时都三思而后行。可能会出现什么样的错误?你是否已经考虑了所有可能出现的逻辑分支?放慢速度,有条不紊的编程虽然看上去很平凡,但这的确是减少缺陷的好办法。

C语言编程中,追求速度的程序员经常会出现的一个问题就是将”==”错误的输入为”=”,而有些编译器并不会警告,这就会造成问题。

不要相信任何人

这里是指用怀疑的眼光来审视所有的输入和所有的结果,直到你能证明这段代码是正确的时候为止。

编码的目标要清晰,而不是简洁

简单是一种美,不要让你的代码过于复杂。即编写的代码一定要逻辑清晰,可读性强。

编译时打开所有警告开关

在你的代码中产生任何警告信息,都应立即修正代码。要知道警告的出现总是有原因的。即使你认为某个警告无关紧要,也不要置之不理。

使用安全的数据结构

我们最常见的一些安全隐患大概是由缓冲溢出引起的。缓冲溢出是由于不正确的使用固定大小的数据结构而造成的。例如,如下这个代码:

char * unsafe_copy(const char * source)

{

char *buffer = new char[10];

strcpy(buffer,source);

return buffer;

}

如果source中的数据长度超过10个字符,它就会造成其它问题。我们可以改成如下形式:

char * safe_copy(const char * source)

{

char *buffer = new char[10];

strncpy(buffer,source,10); //用strncpy代替strcpy可以保护这个代码段

return buffer;

}

检查所有的返回值

如果一个函数返回一个值,他这样做肯定是有理由的。检查这个返回值,如果返回值是一个错误代码,你就必须辨别这个代码并处理所有的错误。不要让错误悄无声息的侵入你的程序;大多数难以察觉的错误都是因为程序员没有检查返回值而出现的。

审慎的处理内存

对于在执行期间所获取的任何资源,必须彻底释放。

在声明位置初始化所有变量

如果你意外的使用了一个没有初始化的变量,那么你的程序在每次运行的时候都将得到不同的结果,这取决于当时内存中的垃圾信息是什么。这样会造成很多随机的行为,给查找带来很多的麻烦。因此,需要在声明每个变量的时候就对它进行初始化。

同时,平时编码时还要注意一些细则

提供默认的行为:Switch语句中将default case的执行明示出来。同样地,如果你要编写一些不带else子句的if语句,停下来想一想,你是否该处理这个逻辑上的默认情况

检查数值的上下限:确保每次运算数值变量都不会溢出,即数据类型的使用要谨慎

注意强制转换是否合理

声明变量,可以使变量的声明位置与使用它的位置尽量接近,从而防止它干扰代码的其他部分

加合理的异常处理、日志文件

正确设置常量

优秀的程序应该做到:关心代码是否健壮

确保每个设想都显示地体现在防御性代码中

希望代码对无用信息的输入有正确的行为

在编程的时候认真思考自己所编写的代码

编写可以保护自己不受其他人的愚蠢伤害的代码。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3431

    浏览量

    92217
  • 代码
    +关注

    关注

    30

    文章

    4536

    浏览量

    66490

原文标题:代码防御性编程的10条技巧

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一种动态防御策略——移动目标防御(MTD)

    网络攻击的技术变得愈发难测,网络攻击者用多态性、混淆、加密和自我修改乔装他们的恶意软件,以此逃避防御性的检测,于是移动目标防御(MTD)技术出现了,通过动态地改变攻击面,有效地对抗日益复杂和隐蔽
    的头像 发表于 01-04 08:04 1022次阅读
    一种动态<b class='flag-5'>防御</b>策略——移动目标<b class='flag-5'>防御</b>(MTD)

    PCB设计工程师不得不知的法则

    PCB是进行设计的物理平台,也是用于原始组件进行电子系统设计的灵活部件。本文将介绍几种PCB设计黄金法则,这些法则自25年前商用PCB设计诞生以来,大多没有任何改变,且广泛适用于各种PCB设计项目
    发表于 12-20 15:57 73次阅读

    实战经验 | 一个 Flash 编程错误标志的探析

    对于每次想要操作 FLASH 之前这个清除动作既感觉多余也感觉别扭, 且还不得不做, 且做了也不知对整个产品
    的头像 发表于 11-10 17:45 303次阅读

    业务接口响应太慢怎么办 如何通过Arthas定位耗时代码

    不知道大家有没有遇到这种情况,接口业务逻辑写完后,用 postman 一调,发现接口响应时间好长,不得不对接口进行优化。但是此时接口的代码往往逻辑比较复杂,调用层次也比较多,很难定位到耗时较长的
    发表于 08-07 09:41 2896次阅读
    业务接口响应太慢怎么办 如何通过Arthas定位耗时<b class='flag-5'>代码</b>块

    磁性材料喷涂,通友智能滚喷机你不得不知

    磁性材料是从民生到高科技产业,从电子产品到医疗技术所依赖的基础,在家电、汽车、电脑、通讯、医疗、航天、军事等领域的应用十分广泛。 磁芯 今天主要聊一聊小尺寸磁芯的喷涂用什么设备好? 最近有很多咨询都是关于磁芯喷涂的,收到的咨询多了就索性写一篇短文来回答一下。 我们通友的智能滚喷机是专业解决各类中小零件的喷涂,其中应用最多的就是磁性材料行业,首先我们自己公司的产线上就有多台设备在用。我们的主要合作伙伴也购置
    的头像 发表于 06-19 13:52 320次阅读
    磁性材料喷涂,通友智能滚喷机你<b class='flag-5'>不得不知</b>!

    做好绕线功率电感器选型你不得不了解的内容

    做好绕线功率电感器选型你不得不了解的内容 编辑:谷景电子 绕线功率电感器在电子器件中起着重要的作用,用于滤除高频噪声和干扰信号。所以,正确选型绕线功率电感器是确保设备正常运行的关键之一。今天文章将为
    的头像 发表于 06-18 20:06 401次阅读

    关于LED灯那些不得不知的事情

    如今,电子工程师是一个令人垂涎的职业。然而,大多数从事此类职业的雇主也希望候选人了解诸如发光二极管,半导体等基础知识。所以这里有一些关于LED灯的事情,每个电子工程师都应该知道。让我们开始吧。
    的头像 发表于 06-18 15:14 911次阅读

    安装OLED拼接屏,不得不知的5大注意事项

    OLED拼接屏是一种高端的显示屏,由多个OLED屏幕拼接而成,可以实现高清、高亮度、高对比度的显示效果。在安装OLED拼接屏时,需要注意以下几点: 1. 确定安装位置: OLED拼接屏通常用于商业展示、广告宣传等场合,因此需要选择一个合适的位置进行安装。安装位置应该具备良好的光线环境和观看角度,以确保观众可以清晰地看到屏幕内容。 2. 测量尺寸: 在安装OLED拼接屏之前,需要先测量安装位置的尺寸,以确保屏幕可以完全覆盖安装位置。同时,还
    的头像 发表于 06-16 09:58 369次阅读
    安装OLED拼接屏,<b class='flag-5'>不得不知</b>的5大注意事项

    FPGA工程师不得不知的FPGA设计经验

    点击上方 蓝字 关注我们 在IC工业中有许多不同的领域,IC设计者的特征也会有些不同。在A领域的一个好的IC设计者也许会花很长时间去熟悉B领域的知识。在我们职业生涯的开始,我们应该问我们自己一些问题,我们想要成为怎样的IC设计者?消费?PC外围?通信?微处理器或DSP?等等。 IC设计的基本规则和流程是一样的,无论啥样的都会加到其中。HDL,和软件等是帮助我们理解芯片的工具。IC的灵魂是知识。因此我们遇到的个挑战将是获得设计的相关信息,然后
    的头像 发表于 06-06 06:45 326次阅读

    不得不知网线水晶头接线顺序-科兰

    众所周知,连接网络除了需要无线信号以外,还需要网线,而网线连接电脑的时候需要用水晶头。网线里面有八条不同颜色的细线,连接的时候不能混乱,那么网线水晶头接线顺序你清楚吗?接下来,科兰小编给大家介绍一下相关内容,一起来看看吧。 网线水晶头接线顺序 1、网线有很多种连接方法,其中ADSL宽带水晶头的顺序是:首先是连接橙白色的网线,然后是接橙色的,接下来是连接绿白色以及蓝色,最后连接蓝白、绿色、棕白以及棕色。 2、交叉线
    的头像 发表于 05-25 10:15 1613次阅读
    <b class='flag-5'>不得不知</b>网线水晶头接线顺序-科兰

    那些关于DIP器件不得不说的坑

    的兼容,但是由于其封装面积和厚度都比较大,而且引脚在插拔过程中很容易被损坏, 可靠较差 。 DIP是最普及的插装型封装,应用范围包括标准逻辑 IC,存贮器 LSI,微机电路等,小外形封装(SOP
    发表于 04-26 09:54

    不得不知的scara机器人应用优势!

    随着工业4.0高速发展和智能自动化大力推进,scara机器人已在工业机器人人领域成为了不可或缺的部分。无论是完成上料组装还是生产装配,可以广泛应用于低压电器、3C电子、医药器械、汽车新能源等行业,都可以用其实现自动化生产和智能制造。 那么scara机器人都具有哪些优点呢? 这是我们因为项目需求而代理的爱普生机器人,稳定性、兼容性深受用户喜欢。它毕竟是全球领先的工业机器人制造商 精度高:scara机器人采用先进的控制系统和伺服电机
    的头像 发表于 04-24 17:31 1581次阅读
    <b class='flag-5'>不得不知</b>的scara机器人应用优势!

    防御编程之断言assert的使用

    防御编程的重点就是需要防御一些程序未曾预料的错误,这是一种提高软件质量的辅助性方法,断言assert就用于防御编程,编写
    的头像 发表于 04-19 11:35 346次阅读

    那些关于DIP器件不得不说的坑

    DIP就是 插件 ,采用这种封装方式的芯片有两排引脚,可以直接焊在有DIP结构的芯片插座上或焊在有相同焊孔数的焊位中。其特点是可以很方便地实现PCB板的 穿孔焊接 ,和主板有很好的兼容,但是由于其
    发表于 04-17 16:59

    C语言开发之防御性编程

    程序员可能无意识的传递了错误参数;外界的强干扰可能将传递的参数修改掉,或者使用随机参数意外的调用函数,因此在执行函数主体前,需要先确定实参是否合法。
    发表于 04-07 15:00 556次阅读