白盒测试——C/C++编程规范(18)
本系列文章将带大家一起解析一下白盒测试经常用到的GJB-8114标准规则,其中一共有124条强制性规则。GJB-8114强制性规则是按类分的,一共有13类,前面的文章已经讲过一部分,本文继续往下讲一下函数调用类规则。
函数调用类一共有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语言中参数的不确定性是没有任何问题的,我们根据参数的意义可以决定出栈的个数。但是现在规则里要求不能这样灵活运用了。