C/C++编程安全标准GJB-8114解读——指针使用类
软件检测实验室在创建软件测试体系或申请CNAS\CMA相关资质时,需要依据相关标准,使用有效的方法开展检验检测活动,GJB-8114是一部嵌入式软件安全测试相关的国家标准,本系列文章我们就针对GJB-8114《C/C++语言编程安全子集》的详细内容举行分析解读。GJB-8114标准规则中一共有124条强制性规则,是按类分的,一共有13类,声明定义类、版面誊写类、指针使用类、分支控制类、跳转控制类、运算处理惩罚类、函数调用类、语句使用类、循环控制类、类型转换类、初始化类、比力判断类以及名称、符号与变量使用类。本文我们针对指针使用类举行解读。
前面的声明定义类和版面誊写类实际上不会引起步伐很大的运行错误,但是指针使用类往往可以或许引起步伐跑飞、非常等等题目。这类规则是肯定不可以或许违反的规则。
R-1-3-1克制指针的指针超过两级
https://i-blog.csdnimg.cn/img_convert/c9396bfd4d9ec1b332776898982f8cb9.png
大家都知道C语言最机动的地方就是指针,大家使用C语言有两个原因,第一个原因是由于它计算得快,第二个原因是它支持各种指针操纵。正是由于它太机动了,它支持指针,所以在指针上最容易犯错误,所以在咱们这个规则中,使用指针最多只能使用两级,再多就不答应了。
R-1-3-2函数指针的使用必须加以&明确说明
https://i-blog.csdnimg.cn/img_convert/639af49996ee455a2b51ea043c6ffd20.png
像违反示例中展示的,我们判断一个函数或者数组的地点是否为空,肯定要用到一个取地点的符号——&。我们以前的C语言都支持取函数的地点时是不用&的,取数组的地点也不用&,现在规定不答应如许用了,取地点时,肯定要用&。这就是一种强制性的要求,实际上违反示例和遵循示例运行起来并没有什么区别。
R-1-3-3克制对参数指针举行赋值
https://i-blog.csdnimg.cn/img_convert/ae7ad656d20a0a0f848fa74782f1c2e1.png
像违反示例中展示的,我们存过来的参数是一个指针,在这里面我们不能针对这个指针将它重新指向另一个地点。我们可以对这个地点举行读写操纵,好比说遵循示例体现的那样,但是我们不可以把地点给修改了。为什么不能修改这个地点呢?由于一旦修改了地点,就容易引起调用它的步伐出题目。
R-1-3-4克制将局部变量地点做为函数返回值返回
https://i-blog.csdnimg.cn/img_convert/0f5704edb6650761e12e0a25cceee721.png
我们一个局部变量的地点通常是在栈或者堆上生成的,我退出这个函数之后,这个栈或者堆就已经释放了,这个地点就可以被其他的步伐应用了。返回这个地点的话,我一旦将这个步伐举行改写,就会影响到别的步伐。
大概大家会说,我在里面写个步伐试试吧,末了发现没有题目呀,也并没有改写呀,那是由于你的那个步伐里不带中断,如果你那个步伐里带中断后,就会发现改写的东西太多了。
R-1-3-5克制使用或释放未分配空间或已被释放的指针
https://i-blog.csdnimg.cn/img_convert/35c439426ca980d17a90f7df9d92854b.png
像违反示例中,我们声明一个指针,实际上这个指针是空的,还有我们给一个指针分配地点,结果我们直接给它举行赋值了。
再就是对于这个指针我并没有给它分配空间,没有分配地点,就是说把这个地点给释放了。
末了是说我分配了一个地点,我把这个地点给释放了之后,又用了这个指针,然后又一次释放,这些都是不答应的。
它偶然间会使步伐跑飞,像违反示例中上面这条指针由于指向的是空,空通常是0,有大概直接就导致死机了。
R-1-3-6指针变量被释放后必须置为空(NULL)
https://i-blog.csdnimg.cn/img_convert/5e0828ad325ee9abeaad38a7945fad64.png
好比违反示例说我们先有一个指针判断,这个指针是否为空,如果不为空的话,我就把它赋值,如果为空的话,我就给它分配一个地点。使用完之后,我就把它给释放了,释放之后,我没有为它赋空值。
步伐下次再进入的时间,由于没有为它赋控制,举行判断的时间就不为空,实际上这个地点已经释放了,但是你依然用到这个地点,这个地点在这个时间有大概已经被别的步伐占用了。
别的步伐还在使用着,你这里又给释放了,就会导致那个步伐就瓦解了。这是我们大多数写步伐的人最容易犯的错误,要求每次释放完之后,都把它赋成空。
R-1-3-7动态指针变量定义时如未分配空间必须初始化为空
https://i-blog.csdnimg.cn/img_convert/885d72c8209ef04974f18996d3bab8c2.png
像违反示例中展示的,我们在声明一个全局变量的指针变量的时间,往往由于它是一个空指针,而不把它赋一个空的值。实际上大多数是直接初始化为空的,但是在有些操纵体系中,在判断它是否为空的时间,它不为空,就会往下执行,就堕落了。
R-1-3-8动态分配的指针变量第一次使用前必须判断是否为空
https://i-blog.csdnimg.cn/img_convert/a8ed0a7f91ff90bea427cd1fc97dd64f.png
好比说像违反示例中展示的,一上来直接为指针分配了一个地点,会造成什么题目呢?好比说我这个指针不是空的,已经为它分配好了地点,又重新为它分配了地点,它原来分配的那块空间就被丢失了,如许就会造成我们整个的存储越来越大,但是又不能为步伐所用,但是这个题目有大概是检测不到的。
R-1-3-9空指针必须使用NULL,克制使用整形数0
https://i-blog.csdnimg.cn/img_convert/3514e20cb6f84e3b78cf12347d723bba.png
NULL在不同的编译器里,它的赋值有大概是不同的,在有些里是0,有些里就不是0,所以你要是把它赋成0的话,就有大概会出题目,所以说不答应用0来取代NULL。
R-1-3-10克制文件指针在步伐退出时没有关闭文件
https://i-blog.csdnimg.cn/img_convert/6e67f2ddc220a3cf6d0a21646075ef8c.png
好比说我们往一个文件里写或者读,我们打开这个文件,读了一些,退出的时间没有关闭这个文件。
如许会造成什么题目呢?就是我们读指针的时间,是读了一段数据以后,读指针今后移了,这时间它是占了一个读写的操纵,也就是说通常我们说它是占了一个通道。
如果你老如许不释放,等于是占用的资源,但是资源个数是有限的。比说说一个for循环里你如许用,占用一个资源没有释放,这个资源就一直被它占着,再申请一个资源,又占一个......到末了肯定是把这个资源给耗空了,你再打开文件的时间就打不开了,由于没有资源了,所以肯定要把它释放,这是第一点。
再有就是,当你往里写东西的时间,如果你不把它关闭,不把这个资源释放,那么有些东西永远也写不进去,这个文件就丢失了数据。
本系列内容整理自优品软件培育计划百场前沿技能系列讲座直播第16期,中国航天科技团体公司软件评测中心研究员李国良为大家带来的《白盒测试——C/C++编程规范》专题讲座,他曾到场过多个大型航空、航天、军工、电子型号项目标测试使命,如需直播回放视频也可私信我获取。
(谢绝转载,更多内容可查看我的专栏)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]