军工,以及交通、医疗、金融乃至航空航天相关的软件,有一个共同的要求就是“高可靠性”,以下几个关键点需要落实:

  1. 严格按照相关规范编写代码

  2. 严格遵循代码审计流程

  3. 分支测试覆盖率高

  4. 需求吻合度高

  5. 以上各点均须量化评估

对覆盖率、吻合度的要求往往就是 100%,这类软件有一个普遍的特点就是单元测试以及自动化测试用例的代码量远超产品的代码量,而且各项文档要求齐备。

关于审计,需要引入工业级的分析软件来量化审计各项指标,这类工具一般都是本着宁可错杀一千也不放过一个的原则,会报出很多问题,但有相当一部分问题实际并不存在,所以排查这些问题也需要相当大的人力物力。可参见国家标准《信息安全技术 代码安全审计规范》(GB/T39412)。

关于编程规范,可以参见《航天型号软件 C 语言安全子集》(GJB 5369)一类的文档,这种文档都有严格的版权限制,这里不便细说,感兴趣的可自行搜索。

规范允许的编程方式一般是编程语言某个较小的子集,一切不受开发者掌控的特性,以及未经过长时间验证的特性均不可使用,没有经过验收的、不被信赖的第三方库是绝对不可使用的,甚至标准库也是难以符合高可靠性要求的。

下面以 MISRA 规范举几个例子,MISRA 是由英国汽车产业软件可靠性协会提出的 C/C++ 语言开发标准,在嵌入式开发领域有较高认可度,是行业级规范,也受版权限制,但在业界流传比较广,这里举几个比较典型的例子。军工级、航天级的规范只会比 MISRA 更严格。

如:

if (flag_1)
{action_1();
}
else if (flag_2)
{action_2();
}   // Non-compliant

这段代码看起来没什么问题,但不符合 MISRA 规范,MISRA 要求所有的 if...else-if 必须以 else 分枝结尾,即使不需要 else 分枝,也应写上空的 else 分枝,并写上为什么不需要,未来会有什么变化等注释。

又如:

#include <stdlib.h>int32_t* fn(uint32_t n)
{return (int32_t*)malloc(n * sizeof(int32_t));   // Non-compliant
}

标准库中资源管理、中断、信号管理、进线程调度一类的函数是不可以使用的。

标准库采用的算法和策略不在使用者的控制之内,很多细节在语言标准中是由实现定义的,也有很多细节是标准没有考虑到位的,有高可靠性要求的嵌入式系统应避免使用相关函数。

又如:

int32_t * fn1( int32_t & x )
{ return &x;   // Non-compliant
}

这段代码返回了参数 x 的地址,即使 x 是引用,也是不符合 MISRA 规范的,虽然在 C++ 语言标准中这不是问题,但规范不允许就是不允许,绝对服从规范是高可靠性软件的编程准则!

由于各种规范都有版权限制,正版文档都有不菲的价格,奇虎 360 质量工程部融汇各种规范,提出《360 安全规则集合》,适用于桌面、服务端及嵌入式软件系统,已在Github上开源,文档全部可以免费下载,请见参见:

360 安全规则集合https://github.com/Qihoo360/safe-rules高可靠性软件的规范往往都十分严格,显得不近人情,但这种规范的制定都有合理的理由,其背后也有惨痛的经验教训,理解规范并遵循规范是值得深入学习和实践的。

军工级、航天级代码长什么样?相关推荐

  1. 风云三号红外遥感+航天级星基融合定位:埃安星灵架构量产发布

    11月8日晚,埃安正式发布了全新一代高端电子电气架构--星灵架构,这也是埃安在发布全新一代AEP 3.0纯电平台不久后,又一项重磅ICV技术发布.星灵架构在去年已经发布的行业第三代电子电气架构EEA ...

  2. 从消费级到航天级,芯片有什么区别?

    已剪辑自: https://www.eefocus.com/article/1343159.html 芯片,作为所有电子产品的核心,已经成为我们日常生活中不可或缺的一部分.小到手表手环,大到火箭卫星, ...

  3. 8999元起!vivo X Fold折叠屏旗舰今日首销:采用航天级浮翼式铰链

    4月11日,vivo举行了新品发布会,推出了全新的vivo X Note.首款折叠屏旗舰vivo X Fold和首款平板电脑vivo Pad等多款新品,其中vivo X Fold凭借航天级浮翼式铰链结 ...

  4. 青龙面板2.8版本+Ninja 保姆级 服务器安装jd代挂教程——(二)

    青龙面板2.8版本+Ninja 保姆级 服务器安装jd代挂教程--(二) 懒人上车链接:点这里上车! 点击链接加入群聊[PiliPili_Cheers~!] 注意 由于扫码登录失效,特更新ck登录教程 ...

  5. 青龙面板2.8版本+Ninja 保姆级 服务器安装jd代挂教程——(一)

    青龙面板2.8版本+Ninja 保姆级 服务器安装jd代挂教程--(一) 懒人上车链接:点这里上车! 青龙等问题探讨群:[PiliPili_Cheers~!] 注意 建议安装系统centos 7/8 ...

  6. CSS父级子级学习总结

    CSS 父级子级 http://www.divcss5.com/rumen/r239.shtml 1.认识了解 简单讲CSS父级 CSS子级是相对而言,如一个DIV "A"被另外一 ...

  7. SONET 的OC 级/STS 级与SDH 的STM 级的对应关系(转)

    SONET 的OC 级/STS 级与SDH 的STM 级的对应关系 线路速率(Mb/s) SONET符号 ITU-T符号 表示线路速率的常用近似值 51.840 OC-1/STS-1 -- 155.5 ...

  8. MySQL 百万级/千万级表 全量更新

    业务需求:今天从生成测试环境迁移了一批百万级/千万级表的数据,领导要求将这批数据进行脱敏处理(将真实姓名 .电话.邮箱.身份证号等敏感信息进行替换).迁移数据记录数如下(小于百万级的全量更新不是本文重 ...

  9. 程序员的好代码长什么模样?

    一天晚上,我和老婆聊天,说部门要我写个"大咖谈软件"的文章,老婆斜了我一眼,淡淡地说:"Linus大神21岁就写出了Linux内核的雏形,缔造了一个自由主义的开源世界:张 ...

最新文章

  1. PHP 面向对象:类的属性
  2. 可简单图化算法(Havel算法)
  3. 二、StreamAPI
  4. MTK平台APP层 通过INvram获取SN号
  5. 在哪开启oracle服务器,开启企业殿堂的钥匙 Oracle服务器的安装
  6. 机器学习中的概率模型和概率密度估计方法及VAE生成式模型详解之二(作者简介)...
  7. matlab rfdata,MATLAB在射频电路设计中的应用
  8. Qt4开发的IP地址切换器
  9. Ado.Net SQL语句参数化(SqlParameter用法)(多条件模糊查询的实现)
  10. PHP简约聚合ZB盒子程序源码
  11. 2.3Java NIO
  12. 铲雪车 骑马修栅栏 (欧拉路径和欧拉回路)
  13. windows下安装redis并设置自启动
  14. 如何提升智慧办公效率?华为云桌面不可少,畅享集中化管理运行
  15. 如何一次性下载全国谷歌卫星影像地图数据
  16. python if else 嵌套格式_python中if嵌套命令实例讲解
  17. 新晋院士,任大学校长!
  18. C++ strcpy的用法
  19. AX6路由器开SSH、固化、刷openwrt
  20. R12 AR INVOICE 接口表导入

热门文章

  1. 如何将图片变成黑白色?
  2. mysql为字段添加索引_Mysql优化-为表字段添加索引
  3. github发布博客
  4. 【Rust日报】2020-04-13 Ruma,Flutter RS,Valora,Rust SSH,mathbench
  5. 作为券商,识别港股软件搭建技巧的分享
  6. Facebook Surround360 学习笔记--(3)硬件设计要点
  7. linux信息收集命令,linux中收集系统信息的一些命令
  8. 人工智能建筑设计方案,人工智能与建筑设计
  9. python100天从新手到大师 pdf_GitHub - DaiJiabin/Python-100-Days: Python - 100天从新手到大师...
  10. 【Qt+FFmpeg】 - FFmpeg解码详细流程