大型和复杂的软件项目使用各种编码标准和指南。这些指南建立了写作软件时必须遵循的基本规则。通常,他们确定:
一种)代码应该如何构建?
b)应该或不应该使用哪种语言功能?
为了有效,规则必须很小,必须具体足以容易理解和记住。
世界上在NASA工作的世界顶级程序员遵循一套制定安全关键代码的指导方针。事实上,许多机构,包括NASA的喷气推进实验室(JPL),专注于用C编程语言编写的代码。这是因为此语言具有广泛的工具支持,例如逻辑模型提取器,调试器,稳定的编译器,强源代码分析仪和度量标准工具。
在批判性情况下,有必要应用这些规则,特别是人类生活可能取决于其正确性和效率。例如,用于控制飞机,航天器或核电厂的软件程序。
但是,您知道如何运行其机器的标准空间代理商?下面,我们列出了JAS的NASA的10个编码规则,由JPL主导科学家Gerard J. Holzmann。它们主要专注于安全参数,您也可以将它们应用于其他编程语言。
规则1 - 简单的控制流程
使用非常简单的控制流量构造写入程序 - 请勿使用setjmp.或者Longjmp.结构体,去陈述,直接或间接递归。
原因:简单的控制流程导致改进的代码清晰度和更强的验证功能。没有递归,将没有循环函数调用图。因此,应该被界定的所有执行仍然存在界限。
规则2 - 固定循环的上限
所有环路必须具有固定的上限。验证工具应该可以静态证明无法超出循环迭代次数的预设上限。
如果无法静态证明循环绑定,则违反规则。
原因:循环界限和缺失的存在阻止了失控的代码。但是,规则不适用于迭代,这意味着不终止(例如,进程调度程序)。在这种情况下,应用了反向规则 - 必须静态证明迭代不能终止。
规则3 - 没有动态内存分配
初始化后请勿使用动态内存分配。
原因:内存分配器喜欢Malloc.而且垃圾收集器通常具有不可预测的行为,可以对绩效进行异常影响。此外,由于程序员的错误也可能发生内存错误,包括
- 试图分配比物理可用更多的内存
- 忘记释放难忘
- 在释放后继续使用内存
- 分配内存上的超限边界
迫使所有要在固定的预定存储区域内生活的模块可以消除这些问题,并使更容易验证内存使用。
在堆叠没有内存分配的情况下动态声称内存的一种方法是使用堆栈存储器。
规则4 - 没有大功能
在标准参考格式上,没有功能应该超过可以在单张纸上打印的标准参考格式,每个声明一行和每条语句一行。这意味着一个函数不应超过60行代码。
原因:过度长功能通常是结构差的迹象。每个函数都应该是一个可以理解的逻辑单元以及可验证。理解计算机显示屏上跨多个屏幕的逻辑单元更难。
规则5 - 低断言密度
该程序的断言密度应平均到每个功能的两个断言。断言用于检查实际执行情况中永远不会发生的异常情况。它们应定义为布尔测试。当断言失败时,应采取显式恢复操作。
如果静态检查工具证明断言永远不会失败或永不保持,则违反规则。
原因:根据行业编码措施统计,单位测试每10到100行代码捕获至少一个缺陷。拦截缺陷的机会随着断言的增加而增加。
断言的使用也很重要,因为它们是强大的防守编码策略的一部分。它们用于验证函数,参数和返回值的函数,参数和返回值的预先发布条件。在测试性能关键代码后,可以选择性禁用断言。
规则6 - 在最小范围内声明数据对象
这一个支持数据隐藏的基本原则。所有数据对象必须以最小可能的范围声明。
原因:如果对象不在范围内,则无法引用或损坏其值。这条规则不鼓励重复使用可能复杂化故障诊断的多种不兼容的目的的变量。
规则7 - 检查参数并返回值
应通过每个调用函数检查非void函数的返回值,并且应在每个函数内检查参数的有效性。
在最严格的形式中,这条规则也意味着即使是返回值Printf.陈述和文件关闭应检查陈述。
原因:如果对错误的响应是没有与成功的响应不同,则应该明确检查返回值。这通常是呼叫的情况关闭和Printf.。将函数返回值明确施放到空白 -表示编码器明确(不偶然)决定忽略返回值。
规则8 - 预处理器的限制使用
预处理器的使用应限于包含头文件和宏定义。递归宏调用,令牌粘贴和可变参数列表是不允许的。
即使在大型应用程序开发工作中,超过一个或两个条件编译指令也应该有理由,超出标准的样品板块,这避免了多个包含相同的头文件。必须通过基于刀具的检查器标记每个此类使用,并在代码中证明。
原因:这C预处理器是一个强大而模棱两可的工具,可以销毁代码清晰度并混淆许多基于文本的验证员。即使手中的正式语言定义,Unbounded预处理器代码中的构建体的效果也可能非常难以破译。
对条件编译的谨慎同样重要 - 只有10个有条件的编译指令,可以有1024个可能的代码(2 ^ 10)代码,这将增加所需的测试工作。
规则第9号 - 指针的限制使用
必须限制指针的使用。不允许不超过一级取消预测。指针解密操作不应隐藏在里面typedef.声明或宏定义。
函数指针也是不允许的。
原因:甚至由专家们很容易滥用指针。它们使其难以遵循或分析程序中的数据流,尤其是基于刀具的静态分析仪。
函数指针还限制了静态分析仪执行的检查类型。因此,只有在其实施有强大的理由时才应使用。如果使用函数指针,则工具几乎不可能证明缺失递归,因此应提供替代方法以弥补分析能力的这种损失。
规则10 - 编译所有代码
必须从开发的第一天编译所有代码。必须在编译器最致密的设置中启用编译器警告。该代码必须使用这些设置编译,而不会出现任何警告。
所有代码都应每天检查至少一个(优选多个)最先进的静态源代码分析仪,并应通过零警告分析过程。
原因:市场上有大量有效的源代码分析仪;其中一些是一种免费软件工具。任何编码器都绝对没有借口不使用这种易于使用的技术。vwin现金开户如果编译器或静态分析仪会困惑,则应重写导致混淆/错误的代码,以便变得更加琐样。
NASA对这些规则说了什么?
“规则就像汽车中的座椅皮带一样:最初他们可能有点不舒服,但过了一段时间,他们的使用变为第二种 - 性质,而不是使用它们变得不可想象。”
断言规则的标题与文本不匹配:文本争论高断层密度。
源头在哪里?
“减速”可能应该是“宣言”。
从未编写过NASA级安全关键软件,我可能会遗漏某些东西,但它几乎总是似乎更容易理解递归函数的完成,例如使用堆栈数据结构的手工滚动递归。
同样在规则10中,所有代码必须“遵守”
@Bar:它似乎是“开发安全关键代码的十大力量”。本文的研究是在与美国国家航空航天局的合同下的JPL,CIT。
来源:http://spinroot.com/gerard/pdf/p10.pdf.
可能是C(和C ++)激发工程师的纯粹的安全规则数量来发明Java。
有没有巧合,其中一半是一个人只是学习c的方式可能解决问题?其余的是改进代码的常见建议。
谁写了这些规则不喜欢Linux内核
“如果静态检查工具证明断言永远不会失败或永远不会持有,则违反规则。”
这个神秘的第三州(从未失败和从未持有的)是什么?静态检查工具已发现?
任何静态检查工具都可以证明它永远不会失败或永远不会违反此规则的任何断言。通过添加无益的“断言(真实)”陈述是不可能满足规则。
对于非琐碎的程序,静态代码分析永远不会完全决定。该指南争辩说,诸如“断言True”(可能永远不会失败)和“issert false”(可能永远不会持有)的陈述,但是静态检查器无法静态确定的那些“断言x> 0”。允许并鼓励X的值。
TL;静态检查器DR可以说真实,假或“我不知道”。
[...]撰写安全关键计划的10个编码规则//www.badherstel.com/nasa-coding-rules/通过duckduckgo [...]
[...]//www.badherstel.com/nasa-coding-rules/[...]
[...]阅读本文有关NASA的编码标准,以创建极其安全的程序。这可能不是[...]
[...]来源:NASA的书写安全关键计划的10个编码规则 - 排名[...]
[...]英文书:NASA的10个写作安全关键计划的编码规则[...]
[...]英文书:NASA的10个写作安全关键计划的编码规则[...]