导读 | 引言: 你知道 NASA 顶级程序员如何编写关键任务代码么?为了确保代码更清楚、更安全、且更容易理解,NASA 的喷气推动实验室制定了 10 条编码规则。 |
NASA 的开发者是编程界最有挑战性的工做之一。他们编写代码并将开发安全的关键任务应用程序做为其主要关注点。html
在这种情形下,遵照一些严格的编码规则是重要的。这些规则覆盖软件开发的多个方面,例如软件应该如何编码、应该使用哪些语言特性等。linux
尽管很难就一个好的编码标准达成共识,NASA 的喷气推动实验室(JPL)遵照一个编码规则,其名为“十的次方:开发安全的关键代码的规则”。程序员
因为 JPL 长期使用 C 语言,这个规则主要是针对于 C 程序语言编写。可是这些规则也能够很容地应用到其它的程序语言。编程
该规则由 JPL 的首席科学家 Gerard J. Holzmann 制定,这些严格的编码规则主要是聚焦于安全。安全
NASA 的 10 条编写关键任务代码的规则:函数
1.限制全部代码为极为简单的控制流结构 — 不用 goto 语句、setjmp 或 longjmp 结构,不用间接或直接的递归调用。工具
2.全部循环必须有一个固定的上限值。必须能够被某个检测工具静态证明,该循环不能达到预置的迭代上限值。若是该上限值不能被静态证明,那么能够认为违背该原则。测试
3.在初始化后不要使用动态内存分配。编码
4.若是一个语句一行、一个声明一行的标准格式来参考,那么函数的长度不该该比超过一张纸。一般这意味着每一个函数的代码行不能超过 60。指针
5.代码中断言的密度平均低至每一个函数 2 个断言。断言被用于检测那些在实际执行中不可能发生的状况。断言必须没有反作用,并应该定义为布尔测试。当一个断言失败时,应该执行一个明确的恢复动做,例如,把错误状况返回给执行该断言失败的函数调用者。对于静态工具来讲,任何能被静态工具证明其永远不会失败或永远不能触发的断言违反了该规则(例如,经过增长无用的 assert(true) 语句是不可能知足这个规则的)。
6.必须在最小的范围内声明数据对象。
7.非 void 函数的返回值在每次函数调用时都必须检查,且在每一个函数内其参数的有效性必须进行检查。
8.预处理器的使用仅限制于包含头文件和简单的宏定义。符号拼接、可变参数列表(省略号)和递归宏调用都是不容许的。全部的宏必须可以扩展为完整的语法单元。条件编译指令的使用一般是晦涩的,但也不老是可以避免。这意味着即便在一个大的软件开发中超过一两个条件编译指令也要有充足的理由,这超出了避免屡次包含头文件的标准作法。每次在代码中这样作的时候必须有基于工具的检查器进行标记,并有充足的理由。
9.应该限制指针的使用。特别是不该该有超过一级的解除指针引用。解除指针引用操做不能够隐含在宏定义或类型声明中。还有,不容许使用函数指针。
10.从开发的第一天起,必须在编译器开启最高级别警告选项的条件下对代码进行编译。在此设置之下,代码必须零警告编译经过。代码必须利用源代码静态分析工具天天至少检查一次或更屡次,且零警告经过。
关于这些规则,NASA 是这么评价的:
这些规则就像汽车中的安全带同样,刚开始你可能感到有一点不适,可是一段时间后就会养成习惯,你会没法想象不使用它们的日子。
做者简介:
Adarsh Verma 是 Fossbytes 的共同创始人,他是一个使人尊敬的企业家,他一直对开源、技术突破和彻底保持密切关注。能够经过邮件联系他 — adarsh.verma@fossbytes.com
via: https://fossbytes.com/nasa-coding-programming-rules-critical/
做者:Adarsh Verma 译者:penghuster 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出