GJB 8114-2013中不恰当的编码规则解析

       软件代码的安全性及可靠性直接关乎相关产品的品质。为了提高代码的安全性及可靠性,各种编码规则标准应运而生。MISRA-C标准由于其起步早、应用广泛、阐述严谨、可操作性强、与时俱进等特性,在众多编码标准中具有举足轻重的地位,是没有争议的编码标准的标杆。考虑到代码安全性及可靠性的重要性,国内也定制了许多编码标准。就目前来说,还没有哪个标准能够同MISRC-C相比较。相对而言,在国内的编码标准中,GJB 8114-2013是比较完善且应用范围较广的编码标准。然而,仅就GJB 8114-2013中的规则来说,还是有部分规则是值得商榷的。下面从中提出几条来同大家一起讨论。

  1. 规则R-1-4-6

        内容:除枚举类型列举完全外,switch必须要有default

       分析:此规则是错误的。switch中default的作用就是处理可预见分支之外的情况。在default中可能是记录下相关信息、返回错误号或者异常处理等。因此default对于软件代码安全性及可靠性具有非常重要的作用,不可以省略。而R-1-4-6却给出了“枚举类型列举完全”的例外,实际情况是即使枚举类型列举完全”,switch条件的取值也可能取到枚举值之外的值,如果出现这种情况,并且没有default语句的话,很可能会代码灾难性的后果。因此规则R-1-4-6具有误导性,是错误且急需改正的。

  1. 规则R-1-4-7

       内容:switch中的casedefault必须以breakreturn终止,共用case必须加以明确注释。 注:共用case必须加以“/* shared/”明确注释。

        分析:此规则文字表述不当,规则不恰当。规则R-1-4-7应该隐含了共用case不必符合“switch中的casedefault必须以breakreturn终止”的规则内容,但如规则中表述也太考验读者的阅读理解能力了。此类的表述可参考MISRA-C,共用case就作为“switch中的casedefault必须以breakreturn终止”的例外情形就是了。规则中指出“共用case必须加以“/* shared/”明确注释”,作为GJB,却使用英文作为共用case是否合规的特征,从哪个角度来说也是不合适的。另外,规则R-1-4-6的一个隐含作用是避免将共用case同未完成的case相混淆。可是,结合case需要大括号、不要出现空块等规则的限制,实际上能够避免将共用case同未完成的case相混淆问题的出现,因此,综合来说,共用case必须加以明确注释的必要性并不大。

  1. 规则R-1-9-1、R-1-9-2、R-1-9-3

        内容:略。

        分析:此三条规则不严谨。此三条规则以“循环控制变量”为核心概念进行指定,可在整个标准中却找不到“循环控制变量”的具体的定义,颇有些国画的“神韵”的意味。可是将“神韵”放到标准之中,恐怕未必合适。

  1. R-1-11-2

        内容:变量初始化禁止隐含依赖于系统的缺省值。

        分析:该规则同其它规则关系不清。由于R-1-11-1规则的内容是“变量禁止未赋值就使用”,从字面意思来看,对于很多编译器来说,在很多情况下,变量未赋值,编译器会自动给其赋值。如此的话,R-1-11-2同R-1-11-1存在很大的相关性,可二者的分界线在哪里呢?可能该规则是参照C语言的某版(C89,C99,C11…)定义指定的,如果是的话,可以参照MISRA-C或者CERT-C,将所参照的具体的定义列出来以便于标准使用者理解。

  1. A-2-7-2

        内容函数中的指针或引用参数如果不是修改项建议使用const说明。

        分析:该规则有些另类。推测该规则制定时是考虑到设计时,确定某参数不是修改项,在编码时就应该添加上const限定符,用以避免出现编码同设计不相符合的情况。而8114标准中的绝大多数规则都不是从设计同实现不一致的角度进行检查,而是纯粹从实现的角度来检测违规,因此显得此规则有些奇怪。

  1. A-1-1-6

        内容:建议用宏或const定义常数

        分析:此规则不严谨。规则中没有对“常数”进行定义。依据定义的不同,代码是否合规会出现不同的结果。

        以上列出了8114标准中部分值得商榷的典型的规则,类似的规则就不一一列举了,造成在编码标准中出现不完善规则的原因肯定有很多。但其中很可能包含以下两点:

  1. 标准制定者将工作重心过多的放在了参考国外的相关标准的表面内容,而忽视了相关规则的前因后果。
  2. 标准制定者没有通过具体编码实践来提取、归纳并检验相关编码规则。

        除了编码规则外,在8114标准中,还给出了依据编码标准进行代码评价方法,这是8114标准相对于其它标准独具特色的部分。然而,尽管该评价方法有一定的合理性,但不可否认的是,该方法仍然有待于进一步完善。比较突出的一个问题就是有些规则以及有些发现的违规无法纳入到评价方法涉及的相关评价指标中,也就导致了评价结果的可参考性仍不能令人满意。相关内容我会在其它文章中分析。

        总的来说,在国内的编码标准中,8114标准算是相对完备的一个,是值得评价的标准,同时也是一个需要完善的编码标准。

你可能感兴趣的:(白盒测试,c编码标准,MISRA-C编码标准,代码质量评价方法,度量指标计算,静态分析涉及标准)