软件代码的安全性及可靠性直接关乎相关产品的品质。为了提高代码的安全性及可靠性,各种编码规则标准应运而生。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中的case和default必须以break或return终止,共用case必须加以明确注释。 注:共用case必须加以“/* shared,/”明确注释。

分析:此规则文字表述不当,规则不恰当。规则R-1-4-7应该隐含了共用case不必符合“switch中的case和default必须以break或return终止”的规则内容,但如规则中表述也太考验读者的阅读理解能力了。此类的表述可参考MISRA-C,共用case就作为“switch中的case和default必须以break或return终止”的例外情形就是了。规则中指出“共用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标准算是相对完备的一个,是值得评价的标准,同时也是一个需要完善的编码标准。

GJB 8114-2013中不恰当的编码规则解析相关推荐

  1. 三菱空调红外码值编码规则解析

    三菱空调红外码值编码规则解析 一.空调红外控制原理 空调遥控器是通过发射断断续续的红外光来传递信息的,我们可以把发射的时候看做是"1",没发射的时候看做是"0" ...

  2. UTF-8编码规则解析

    在将多个(UTF-8)字节数组转换为字符串的时候,可能会发生乱码,这不是因为编码问题. UTF-8是一种变长字节编码方式.对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0:如果是多 ...

  3. Cesium源码解析三(metadata元数据拓展中行列号的分块规则解析)

    目录 1.前言 2.layer.json中available参数意义 3.EPSG:4626切片及terrain分块原理 4.Cesium的terrain分块规则 5.自定义terrain分块规则 6 ...

  4. EXCEL 2013中“定义名称”的命名规则

    名称可以包含字母.汉字.数字.以及[_][.][?]三种符号. 名称具有唯一性. 名称必须以字母或汉字或下划线_作为开头,不能以数字.字母R.字母C作为开头,并且不能像单元格引用,例如,32和A4都不 ...

  5. 使用codesense的GJB 8114模板对c++源代码规则检测示例

    ↵ 关于GJB 8114  2013年7⽉10⽇,中国⼈民解放军总装备部发布了中华⼈民共和国国家军⽤标准GJB 8114,全称为国军标 8114-2013<C/C++语⾔编程安全⼦集>,提 ...

  6. 以太坊RLP编码规则

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链中以太坊RLP编码规则! RLP(Recursive Length Prefix,递归长度前缀)编码算法,是以太坊 ...

  7. 对没有标记为安全的activex控件进行初始化和脚本运行_新的C++安全编码规则出炉...

    新的安全编码规则 在Visual Studio v16.8 Preview 3中,我们添加了一些新的安全编码规则,来帮助开发者更容易找到一些更加容易导致Bug的编码错误,这些错误涵盖了从简单的功能缺失 ...

  8. 已设置了参考编号的编码规则定义,但是新增单据的时候,没有出来自动编号是什么原因?...

    问题描述: 在AIO5系统中,已经在编码规则中设置了自动编号的,但是点击新增单据的时候,没有自动编码,是什么原因? 自动编码规则设置如图: 原因分析: 1.没有点击小钥匙标识. 2.没有在对象设置中, ...

  9. 实施Exchange 2013中的 MailTip

    实施Exchange 2013中的 MailTip 邮件提示是用户撰写邮件时向其显示的提示性消息.Microsoft Exchange Server 2013 将分析邮件(包括向其发送了邮件的收件人的 ...

  10. javascript中的Base64.UTF8编码与解码详解

    javascript中的Base64.UTF8编码与解码详解 本文给大家介绍的是javascript中的Base64.UTF8编码与解码的函数源码分享以及使用范例,十分实用,推荐给小伙伴们,希望大家能 ...

最新文章

  1. 用了 10 年 Windows 后,我最终转向 Linux
  2. 共享内存+Shellcode实现跨进程调用3环函数
  3. Colored Sticks--POJ 2513
  4. iOS中SQLite持久化存储第三方库FMDB
  5. 20200121每日一句
  6. cfree安装与使用
  7. 苹果6代掉水里怎么办 iPhone6掉水处理方法
  8. ae导出html,AE导出json格式的Web动画工具 Bodymovin v5.6.1 + 使用教程
  9. vmware player 虚拟机下windows系统安装vmware tools
  10. 分享盒子直播软件.已测试,网络机顶盒看电视直播哪个软件好(最好用的三款免费直播软件分享)...
  11. 【生活中的逻辑谬误】以暴制暴和压制理性
  12. #KINDLE 电子书制作指南 html转kf8/mobi
  13. NR SSB概述 - PSS/SSS序列及PBCH
  14. 【转】ATF中SMC深入理解
  15. 服务器 无线 有线,【干货】有线无线一体化移动网
  16. cogs 1487. 麻球繁衍
  17. WebDav的几种应用方法
  18. C++中构造函数的超详细讲解
  19. 关于RSA算法的探究 -Crypto 0x01
  20. 【安装篇】- 基于 VMWARE Oracle Linux7.9 安装 Oracle19c RAC 详细配置方案

热门文章

  1. c语言课后练习题第四章
  2. 网上银行“安全登录控件”分析(zt)
  3. 软件测试工具Winrunner使用的技巧
  4. 4级网络工程师第5套知识点
  5. 主成分分析与因子分析及SPSS实现
  6. 锋利的jQuery--Ajax(读书笔记四)
  7. Android音视频编辑器架构图与分析
  8. Java经典基础项目——《学生教务系统》立项需求说明书
  9. 小米9se无法连接adb的问题
  10. matlab实现sift,SIFT算法的Matlab实现