顶级程序员编程10大法则

简介:   NASA 的开发者是编程界最有挑战性的工作之一。他们编写代码并将开发安全的关键任务应用程序作为其主要关注点。  在这种情形下,遵守一些严格的编码规则是重要的。这些规则覆盖软件开发的多个方面,例如软件应该如何编码、应该使用哪些语言特性等。  尽管很难就一个好的编码标准达成共识,NASA 的喷气推进实验室(JPL)遵守一个编码规则,其名为“十的次方:开发安全的关键代码的规则”。

  NASA 的开发者是编程界最有挑战性的工作之一。他们编写代码并将开发安全的关键任务应用程序作为其主要关注点。

  在这种情形下,遵守一些严格的编码规则是重要的。这些规则覆盖软件开发的多个方面,例如软件应该如何编码、应该使用哪些语言特性等。

  尽管很难就一个好的编码标准达成共识,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 是这么评价的:

  这些规则就像汽车中的安全带一样,刚开始你可能感到有一点不适,但是一段时间后就会养成习惯,你会无法想象不使用它们的日子。

目录
相关文章
|
存储 Java 数据安全/隐私保护
【CompareAndSwap底层原理】
【CompareAndSwap底层原理】
143 0
|
中间件 Linux
Centos中配置开机自启动的方式汇总(上)
Centos中配置开机自启动的方式汇总(上)
2470 0
Centos中配置开机自启动的方式汇总(上)
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
2075 5
|
安全 网络安全 数据安全/隐私保护
DMZ与端口转发的区别
【4月更文挑战第9天】
1332 4
idea+git实现提交自动去除无用import以及格式化代码
idea+git实现提交自动去除无用import以及格式化代码
918 0
npm install 太慢?解决方法
npm install 太慢?解决方法
11674 0
|
NoSQL 数据库
Navicat查看并导出ER图
Navicat查看并导出ER图
905 0
Navicat查看并导出ER图
|
消息中间件 关系型数据库 MySQL
(7)FlinkSQL将kafka数据写入到mysql方式二
FlinkSQL将kafka数据写入到mysql方式二
(7)FlinkSQL将kafka数据写入到mysql方式二
|
人工智能 前端开发 Java
阿里技术协会(ATA)10月系列精选文集
阿里技术协会优质文章集锦系列,集合了阿里技术人的知识沉淀分享,包括:JAVA核心技术、架构、人工智能、移动、前端等优质技术文章。
18308 0
|
存储 弹性计算
混合云备份服务异地备份和恢复实践
阿里混合云备份服务是一套已经商业化的原生备份服务,提供了简单易用,并且高效安全的数据保护方案。阿里混合云备份服务能够定期的对指定关键数据进行增量的扫描,并对备份的数据采用了高效的重删加压缩的算法,在为关键数据保驾护航的同时又极大的减少了备份数据的存储空间占用,有效的节省成本。
2786 0