作者 |?李伟 上海控安安全测评部总监
来源 |?鉴源实验室
社群 |?添加微信号“TICPShanghai”加入“上海控安51fusa安全社区”
前几篇我们介绍了代码的不同类型结构覆盖率测试,属于代码的动态测试,本章我们介绍代码编码规则的静态测试。
01
关于代码静态检测
静态代码测试通常按照既定的编码规则,检查被测试代码的语法、语义、结构等,是否符合编码规则的要求。代码的静态测试和动态测试的区别主要有以下几点:
1.?代码静态测试不会运行代码,代码动态测试会运行代码;
2.?静态测试会依据相应语言的编码规则,动态测试跟编码规则没有直接关系;
3.?静态测试和动态测试都可以通过人工结合工具辅助的方式执行,工具在静态编码规则检测效率和工具自动执行完成率上,普遍高于动态的结构覆盖测试;
4.?代码静态规则检测的部分准则内容在编译器编译代码时会执行类似的检查,但是编译器不会在编译时执行代码的动态结构覆盖检测。
02
代码规则检测的编码标准
不同的编程语言有不同的编码标准,我们以C语言为例,C代码的编码标准广为人知的有Misra-C、CERT-C、EADS-C、BARR-C等,我国常见C编码标准有GJB 5369、GJB 8114等。这其中应用最广泛的可能就是Misra-C了,有很多文章专门对其进行介绍,我们不做过多说明。同样C++和JAVA也有对应的国际组织或行业小组编制了相应的编码标准规范。
03
国军标编码规范的举例说明
本章我们使用GJB 8114标准列举其中的一些编码准则,让大家有所认识。该标准的规则大体可以分为两类,一类是强制准则,还有一类是建议推荐准则。
3.1?强制准则举例
[GJB8114-2013] R-1-1-1 禁止通过宏定义改变关键字和基本类型含义。
描述:禁止通过宏定义改变关键字和基本类型含义。
正确示例:
错误示例:
3.2?建议准则举例
[GJB8114-2013] A-2-9-2 建议除常数指针外,const说明均在类型说明的最外层。
描述:建议除常数指针外,const说明均在类型说明的最外层。
示例:
GJB8114定义的C代码准则从13个方面逐个进行约束,准则的条目较多,工作中涉及到政府、国企的高安全要求项目时该规范的使用率比较高,有需要时可以直接参考标准文档。
04
代码静态规则检测的过程
我们对一个工程的代码或者工程中几个代码文件进行静态规则检测时,必须提前做一些准备工作,来保证测试的顺利执行。
首先要确定代码编写的语言,C、C++或者其他语言,要确认工程使用的IDE以及编译器,最好能确定工程代码的头文件或者路径,以及宏定义。然后我们需要确定进行代码静态检测的标准依据,是Misra C还是GJB 8114,以及标准的版本如Misra-C 2004。
完成上述的准备工作后我们就可以选择使用的测试工具,是否已购买相关工具,还是使用开源产品,目前可以支持代码静态规则检测的开源工具还是比较多的,其中也有做的很好的产品,考虑到项目客户方对检测结果的认可程度,建议使用已通过相关认证的商用软件工具进行测试。
4.1?工具测试举例
我们以TestGrid工具(SmartRocket TestGrid嵌入式软件自动化测试平台)为例展示一个开源C代码项目基于Micra-C 2004准则的静态代码测试。首先我们建立一个规则模板,并将Micra-C 2004标准应用到该模板,如下图:
从图中我们也可以得知,规则的模板是允许自定义组合的,意味着可以从已知的标准规则集中自由选取相关条目,根据需要组合成新的规则集合用于测试活动。
接下来我们将收集的工程相关信息填入测试配置,填入信息必须要准确,如下图所示:
配置完成后执行规则检查,执行完成结果如下图显示:
我们以被测文件为基准,查看该文件中的代码违反了哪些编码准则,选中某准则会跳转到该文件中所有违反该准则的界面,如下图所示:
可以通过详情查看违反编码准则的详细内容,开发人员可以根据说明有针对性地进行代码改进。
05
测试小结
在执行代码的静态规则检测时我们有以下建议供大家参考:
1.使用工具执行代码的规则检查可以大大提高测试工作的执行效率。
2.工具设置规则执行严格时容易误报,执行规则设置宽松时容易漏报,这是正常现象。
3.代码的规则检测需要跟实际项目上需要使用的规则进行适当结合和调整匹配,切不可不顾实际直接使用Misra C等规则进行生搬硬套。客户方的项目需求提出明确要求时除外。
4.即使使用Misra C或者国军标的相关标准,规则内的约束门限值也需要结合实际情况在项目内协商确定,如单个函数的建议和最大行数,圈复杂度,if后一次判定参与条件的最大个数等等门限值设定。
参考文献:
[1]?GJB 8114-2013 《C/C++语言编程安全子集》?