C/C++编程安全标准GJB-8114解读——函数调用类

在软件测试团队建立软件测试体系或软件测试实验室申请CNAS/CMA认定时,都需要依据相关技术标准,确认权威的测试方法,指导日常的软件测试工作。GJB-8114《C/C++语言编程安全子集》是一部嵌入式软件安全测试相关的国家标准,本系列文章我们针对GJB-8114标准的具体内容进行解读和介绍,前面已经为大家介绍了声明定义类、版面书写类、指针使用类、分支控制类和运算处理,本文我们继续为大家介绍函数调用类。

函数调用类

函数调用类一共有16条规则。

R-1-7-1
禁止覆盖标准函数库的函数


这是一条颠覆我们用C++写程序的人的规则,不能用标准函数库中的那些名字作为自己写的函数的名字。比如说printf,这是一个标准的函数名字,你写函数的时候就不能用这个名字了,要写成其他的名字。

但是在C++中,这种情况是比较常见的,重名的函数有很多,而且根据它的参数的类型的不同,我们也可以定义成一个相同名字的函数,根据参数类型来确定调用哪一个函数,这是C++中常用到的,但是C语言中不允许这样做。


R-1-7-2
禁止函数的实参和形参类型不一致


这个是说,我们声明一个函数,规定了它的参数是什么类型了,但是我们用它的时候没有用到这种类型。像违背示例中展示的,我们规定了p1是整型的,但是它传递的参数是一个无符号的整型数。这种情况下通常我们做的时候如果关掉二级警告的时候编译不会出问题,只要打开二级警告的时候也会是出问题的。要像遵循示例中那样,做一个强制类型转换,把它直接转成int型。

R-1-7-3
实参与形参个数必须一致


通常我们自己写程序的时候违背示例中那样也能符合规则,但是在C语言中,如果在咱们自己写程序的过程中也用那种形式的话,就会违反这个规则。所以我们自己写程序的时候要用到多少个参数,事先我我们是都定好的,不会根据不同的场景来决定参数的个数。

这个可能大家对这条规则有些困惑,为什么会提出来这样的一条规则呢,函数调用的时候有一个入栈顺序、一个汇编的顺序、一个C的顺序,汇编的顺序压栈第一个、第二个、第三个、第四个,大家都知道栈是从最后一个压进去的,但是C语言不是。

C语言压栈是从最后一个开始压的,C语言是从后往前压,而汇编是从前往后压,所以就造成了在C语言中参数的不确定性是没有任何问题的,我们根据参数的意义可以决定出栈的个数。但是现在规则里要求不能这样灵活运用了。

R-1-7-4
禁止使用旧形式的函数参数表定义形式

岁数比较大的人刚开始学习C语言的时候,标准的C语言的写法,在声明一个函数的时候,它参数是不给名字的,只给类型,比如说像违背示例中的类型1、类型2,现在要求必须把类型跟这个类型对应的变量名、参数名对应起来。这个规则对年轻人是没有什么影响的,可能对一些年龄比较大的人影响比较大。

R-1-7-5
函数声明和函数定义中的参数类型必须一致

前面是声明、后面是定义,我们声明的时候声明了几种类型,我们定义这个函数的时候,参数类型又变了,这个是不允许的。现在的C语言中,为了符合C++规则,有一个自动匹配的功能,认为这两个函数不是一个函数。

R-1-7-6
函数声明和函数定义中的返回类型必须一致

函数本身有一个类型,我将它声明了一个类型,我们在定义的时候,必须和声明的类型一致,如果不一致的话就是错的。

R-1-7-7
有返回值的函数必须通过返回语句返回

也就是说凡是定义了一个函数不是void类型的,一定要用return多少或者return什么来返回,只要没用return语句,就是有问题的。

R-1-7-8
禁止无返回值函数的返回语句带有返回值

像违背示例中展示的就是一个没有返回值的void,最后却返回了一个返回值,这样也是不允许的,必须是像遵循示例中展示的不带返回值的。


R-1-7-9
有返回值函数的返回语句必须带有返回值

像违背示例中展示的,这个函数本身是有类型的,所以return那里必须带一个返回值,没带返回值的就是错的。

R-1-7-10
函数返回值的类型必须与定义一致

像违背示例中展示的,这个函数我们定义的时候定义的是一个整型,结果返回的时候返回的是一个浮点数和正整数,这样就是不对的。

R-1-7-11
具有返回值的函数,其返回值如果不被使用,调用时应有(void)说明

如果我们不用这个函数的返回值,只调用它返回的过程,我们调用这个函数的时候,一定要按照遵循示例中那样写,不能像违背示例中那样直接调用。但是实际上违背示例中那样写对结果是没有影响的。

R-1-7-12
无返回值的函数,调用时禁止再使用(void)重复说明

本来我们已经用void声明了这个函数,没有返回值了,调用这个函数的时候,我就不能在用void来重复地定义它了,这个跟咱们变量的相关内容还是有些矛盾的,大家就记住这一条规则就行了。

R-1-7-13
静态函数必须被使用

在程序当中可以声明一个函数为静态函数,原则上来说,这个静态函数必须在其他程序当中被使用到。如果没有被使用到的话,这个函数就是一个冗余的函数。

对于冗余函数来说,我们通常要求不要有冗余的东西,如果有冗余的东西也不算你错。但是你要是有一个静态的冗余的东西,那就认为是错了,这是一个强制性的要求。

R-1-7-14
禁止同一个表达式中调用多个顺序相关函数

通常有一条规则,大家写程序的时候,能不用全局变量就不要用全局变量,能少用全局变量就少用全局变量。由于我们在不同的程序当中有可能会用到同一个全局变量,先执行哪个程序对结果会有一个很大的影响。

你看两个程序哪个在前面执行哪个在后面执行,他们俩好像没有什么关系,但实际上他们俩涉及到了对同一个变量的修改,它的前后顺序对结果有绝对影响,这个时候是不允许来修改它的前后顺序的。

这个引申一点说就是,在我们的硬件上也有一个时序问题,时序有可能对一个功能影响很大。我们用软件启动一个硬件的时序,有时候可能有几条log语句我们认为没什么用,就删掉了,但是涉及到硬件有可能就是错误的,可能会导致实现不了功能。

R-1-7-15
禁止在函数参数表中使用省略号

像违背示例中展示的,在早期的C语言中有好多都是这样做的,某一个参数个数不定,我在这里是可以使用省略号的,现在不允许这样做了。

R-1-7-16
禁止使用直接或间接自调用函数

这个也就是说自己调用自己,或者自己调用了一个别的函数,别的函数再调用了它自己,这样就是一个递归调用。我们在计算阶乘的时候往往大家都爱用递归调用来写,但是这个有一个最大的坏处,递归调用递归多少层你不知道,有可能会使你的程序把堆栈都给占光了,然后造成崩溃,所以现在就规定了,不允许递归调用。

以上就是针对GJB-8114《C/C++语言编程安全子集》标准中,函数调用类的相关要求,后面会继续为大家介绍语句使用类规则,欢迎大家继续关注。

本系列内容整理自优品软件培育计划百场前沿技术系列讲座直播第16期,中国航天科技集团公司软件评测中心研究员李国良为大家带来的《白盒测试——C/C++编程规范》专题讲座,他曾参与过多个大型航空、航天、军工、电子型号项目的测试任务,如需直播回放视频也可私信我获取。

(谢绝转载,更多内容可查看我的专栏)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值