@ProX
2020-05-29T04:37:19.000000Z
字数 1474
阅读 322
InfoQ
如何才能成为顶级程序员?
10条NASA顶级程序员的编码规范告诉你该如何做。
在NASA做开发是编程界最具挑战性的工作之一。他们编写代码并开发关键任务应用程序,安全是他们首要关注的重点。
在这种情况下,制定严格的编码规范并加以遵循,对于他们来说十分重要。这些规则涵盖了软件开发的各个方面,比如软件应该如何编写,应该使用哪些语言特性等等。
尽管很难就好的编码标准达成共识,但NASA的JPL遵循了一套名为“安全关键代码开发10大准则”的规范。
由于JPL的工作内容主要与C语言相关,因此本指南主要关注C语言编写的代码。但是这些标准也可以灵活运用到其他语言上。
该规则由JPL的首席科学家Gerard J. Holzmann制定,这些严格的编码规范主要聚焦于安全方面。下面进行简要介绍。
NASA的十大编码准则:
简化控制流程。尽可能使用精简的控制流程编写程序 – 不要使用goto,setjmp或longjmp语句,不用直接或间接的递归调用。
固定循环次数上限。所有的循环必须有一个固定的上限。必须可以被检测工具验证证实,该循环不能超过预置的迭代上限值。如果该上限值不能被证实,那么可以认为违背了该原则。
不要在初始化完成后进行动态内存分配。
避免使用冗长的函数。函数的长度应在一张纸的范围内,标准格式为一个语句一行、一个声明一行。通常,每个函数的代码行数不能超过60。
保持低断言密度。代码中断言的密度应该平均低至每个函数2个断言。断言被用于检测在实际执行中的不太可能发生的异常情况。断言必须没有副作用,并应该定义为布尔测试。当一个断言失败时,应该执行一个明确的恢复操作,例如,把错误情况返回给执行该断言失败的函数调用者。被静态检查工具证实其永远不会失败或永远不能触发的断言违反了该规则(例如,通过增加无用的 assert(true) 语句是不可能满足这个规则的)。
必须在最小的范围内声明数据对象。
注意参数检查。非void函数的返回值在每次函数调用时都必须检查,且在每个函数内其参数的有效性必须进行检查。
限制预处理程序的使用。预处理器的使用仅受包含头文件和简单的宏定义的限制。符号拼接、可变参数列表(省略号)和递归宏调用不被允许。所有的宏必须扩展为完整的语法单元。条件编译指令的使用通常令人怀疑,但始终不能避免。这意味着即使在一个大的软件开发中,也应该很少有理由使用一个或两个以上的条件编译指令,这超出了避免多次包含头文件的标准做法。每次在代码中这样做的时候必须有基于工具的检查器进行标记,并在代码中说明理由。
限制指针的使用。特别是不应该有超过一级的解除指针引用。解除指针引用操作不可以隐含在宏定义或类型声明中。另外,不允许使用函数指针。
高级别警告编译代码。从开发工作第一天开始时,在编译器开启最高级别警告选项下对代码进行编译。在此设置之下,代码必须零警告编译通过。代码必须利用源代码静态分析工具每天至少检查一次或更多次,且零警告通过。
关于这些规范,NASA这样评价:
这些规范就像要求你坐车的时候必须系上安全带一样,刚开始可能会让你觉得不舒服,但之后你就会慢慢习惯,并无法接受没有这些规范的日子。
参考资料:How to code like the top Programmers at NASA — 10 critical rules
Adarsh Verma
Fossbytes的共同创始人、企业家,关注开源、技术和安全。
How to code like the top Programmers at NASA — 10 critical rules