C++编码规范:JSF-AV(未完待续)

联合打击战斗机计划(英语:Joint Strike Fighter Program,简称JSF)是一个由美国和其盟国发起的新一代战斗机发展和采购项目。该项目旨在取代大量已老化的战斗机、战斗轰炸机和攻击机。该项目计划在未来取代各种西方主力战机,包括F-16、A-10、F/A-18、AV-8B和海鹞式战机。波音的X-32方案和洛克希德.马丁(Lockheed Martin,下文简称“洛马”)公司的X-35方案进入了最后的角逐。

经过各阶段试验后,X-35于2001年10月26日击败X-32获选,并授予编号为F-35。之后,联合打击战斗机计划正式进入了系统研制与验证(System Development and Demonstration,SDD)阶段。该阶段为期126个月,总费用高达200亿美元。

在系统研制与验证阶段,洛马公司专门编写了JSF项目的C++编程规范以约束相关开发人员和供货商提供的软件代码。该编程规范全称为《联合打击战斗机项目系统研制与验证阶段航空器C++编程规范》。该编程规范在2005年一年内完成编写,期间共经历2次修改,最新版本为“Rev C”。

 

 

该编程规范旨在为C++程序员提供指导,使其编写代码都具有良好的编程风格并经过相应的验证,从而保证代码安全性、可靠性、可测试性和可维护性。

洛马公司要求相关航空器系统代码强制遵循该规范,并推荐其它非航空器系统代码参照执行。

该编程规范在编写时借鉴了MISRA C 安全编程规范的相关内容,并在其之上增加了针对继承、模板和命名空间等C++特性的编程规范。

该标准希望通过相关约束来保证代码具有以下几个特性:

可靠性:代码应该以可预测的方式执行,并满足所有要求。

可移植性:源代码不应包含依赖编译器或链接器的内容

可维护性:代码应风格一致、设计简单且易于调试。

可测试性:代码应在规模大小、复杂性和静态路径数量这三个维度尽量保持较低数值,以此减低测试工作的难度。

可复用性:鼓励使用可复用组件。

可扩展性:期望在软件系统全周期中可以不断发展,并为此提供相应支持或基础。

可读性:源代码应该以易于阅读、理解和使用的方式编写

同时,该编程规范针对代码的耦合性与内聚性提出了如下要求:

  • 将与硬件和外部软件的交互限制在少数函数内;
  • 尽量减少对全局数据的使用;
  • 尽量不暴露实施细节。

该编程规范有“shall”“will”和“should”三个遵守级别,其各自代表内容如下:

  • should属于较为强烈的建议要求
  • will属于强制性要求,但是这类要求不要求验证,因此这类要求仅限于非安全攸关(non-safety-critical)的要求,例如命名约定等;
  • shall也属于强制性要求,但是这类要求必须由工具或人工进行确认。

与其它编程规范不同的是,该编程规范明确说了如果在编程过程中确实需要违反相关规则所需的手续。这一点是与其它编程规范完全不同的,它体现了该规范作为洛马内部编程要求的实操性。建议有内部编程规范的公司也借鉴该部分。该部分具体内容包括:

  • 当违反“should”规则时,需要有软件开发负责人(software engineering lead)的批准;
  • 当违反“will”和“shall”规则时,需要有软件开发负责人和产品经理的批准
  • 所有对“shall”级规则的违背都应有相应记录文档。

在内容上,每条规范以“AV”为标识符,例如 "AV Rule 1"指第一编程规范。每个编程规范分为描述、原因解释、示例和备注四个部分。

描述用于说明要求内容,该规范的描述都比较简略,有时还会省略为“参见其它规范或书籍的XXX条”。同时,该部分有时还包含大量其它航空标准的内容,例如“只有符合DO-178 A级或SEAL 1级认证的C/C++ 库函数可以在安全攸关(SEAL 1)的代码中使用”。其中DO-178是指“《机载软件适航标准》Software Considerations in Airborne Systems and Equipment Certification”,而“SEAL 1”则是在《JSF系统安全项目计划》JSF System Safety Program Plan中定义。由此可以看到,该编程规范与其它航空或JSF项目文档紧密相关,也从一个侧面反映了洛马及欧美航空领域规范体系的建设水平。

示例(Examples部分为遵守或违反相关规则的代码。该部分内容较少,且仅有少量规则有对应示例,不过在该文档的附录中有大量针对具体规则的示例。

原因解释(Rationale用于阐述设定该规则的原因,通过该内容,编程人员可以“知其所以然”。同时,该部分内容是其它很多编程规范所缺失的

备注(Note)涉及范围比较多,包括遵守要求、编译选项等。

代码量和复杂度

任何一个方法或函数的总行数不应超过200行。

 过长的函数会导致逻辑复杂且不利于测试。

There shall not be any self-modifying code。

所有函数的复杂度不能高于20。

C++编码标准

术语

抽象类(abstract base class)是不能创建实体的类,它只能作为基类由其它类来继承,抽象类至少包含一个纯虚函数。

抽象数据类型(abstract data type)


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/315936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web3的应用发展及其影响

Web3,又被称为去中心化Web,是互联网发展的一个阶段,其核心特点是数据的去中心化和用户自主权。近年来,随着区块链技术的不断成熟,Web3的应用也得到了广泛的关注和发展。在这篇文章中,我们将深入探讨Web3目前…

一文了解2024年AMC8竞赛模拟考试安排的重点和注意事项(附资源)

各位报名参加2024年AMC8竞赛的家长和孩子们注意了!今天到明天就可以参加AMC8竞赛的模拟考试了,本文结合本次模拟考试的常见问题为大家进行了梳理,站在参赛者的角度把2024年AMC8的模拟考试的关键事项和要点说清楚,让您最准确、快速…

JUC02同步和锁

同步&锁 相关笔记:www.zgtsky.top 临界区 临界资源:一次仅允许一个进程使用的资源成为临界资源 临界区:访问临界资源的代码块 竞态条件:多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测&am…

... * Images are published to: /custom_ns/custom_camera/custo ...

using yaml rules: yaml.safe_load() failed mapping values are not allowed herein "<unicode string>", line 205, column 42:... * Images are published to: /custom_ns/custom_camera/custo ... 说出来有点不信&#xff0c;居然是这个注释可能不安…

Flink定制化功能开发,demo代码

前言&#xff1a; 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API&#xff0c;以kafka为数据源&#xff0c;构建一个基础测试环境&#xff1b;包含一个kafka生产者线程工具&#xff0c;一个自定义FilterFunction算子&#xff0c;一个自定义MapFunctio…

Spring Boot - Application Events 的发布顺序_ApplicationReadyEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

每日一练:LeeCode-111. 二叉树的最小深度【二叉树】

本文是力扣LeeCode-111. 二叉树的最小深度 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子…

Java异常处理--异常处理的方式1:try-catch-finally

文章目录 一、异常处理概述二、方式1&#xff1a;捕获异常&#xff08;try-catch-finally&#xff09;&#xff08;1&#xff09;抓抛模型&#xff08;2&#xff09;try-catch-finally基本格式1、基本语法2、整体执行过程3、try和catch3.1 try3.2 catch (Exceptiontype e) &…

掌握 gRPC 和 RPC 的关键区别

一、远程过程调用协议简介 1、RPC 的本质 首先&#xff0c;我们探讨一下什么是 RPC。RPC&#xff0c;缩写为 Remote Procedure Call Protocol&#xff0c;直译来看就是远程过程调用协议。 讲得通俗一些&#xff1a; RPC 是一种通信机制RPC 实现了客户端/服务器通信模型 官…

【数据集处理】FFHQ如何进行人脸对齐,Aligned and cropped images at 1024×1024

什么是人脸对齐&#xff1f; 人脸对齐是一种图像处理技术&#xff0c;旨在将图像中的人脸部分对齐到一个标准位置或形状。在许多情况下&#xff0c;这通常涉及将眼睛、鼻子和嘴巴等关键点对齐到特定的位置。通过这种方式&#xff0c;所有的人脸图像可以有一个一致的方向和尺寸…

【JVM的相关参数和调优】

文章目录 JVM 调优的参数类型一、标配参数二、X参数三、XX参数 JVM 调优的常用参数 JVM 调优的参数类型 一、标配参数 这类此参数在jdk的各个版本之间很少会变化&#xff0c;基本不改变 java -version&#xff0c;查看当前电脑上的jdk的版本信息 java -help&#xff0c;查看…

阴盘奇门八字排盘马星位置计算方法php代码

如下位置&#xff0c;马星的四个位置。 计算方法&#xff1a; 1。先根据出生年月日&#xff0c;计算得八字四柱。比如 2024年01月09日&#xff0c;四柱为 其中时柱地支为“申” 2。然后根据以下对应的数组&#xff0c;来找到id号&#xff0c;即马星位置。 根据下表来找到&am…

开机自启动android app

Android App开机自启动_android 开机自启动-CSDN博客 注意权限问题&#xff1a; 第二种实现方式&#xff1a;系统桌面应用 问&#xff1a;android的系统桌面应用启动是什么&#xff1a; 答&#xff1a; Android 系统桌面应用是指用户在设备主屏幕上看到的默认启动界面&…

What does `HandlerInterceptor` do?

HandlerInterceptor 是 SpringMVC 中的一个接口&#xff0c;在SpringMVC应用中它提供了一种实现应用级拦截器的机制。 第1步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

利用 Azure Data Bricks的免费资源学习云上大数据

在这个数据驱动的时代&#xff0c;大数据和云计算已成为推动技术创新和商业智能的关键因素。Azure Databricks&#xff0c;作为一个先进的云平台&#xff0c;为那些渴望深入了解和掌握这些技术的人们提供了一个理想的学习环境。我们这里将利用 Azure Databricks 的免费资源&…

C语言进阶指南(22)——文件管理函数

欢迎来到博主的专栏——C语言进阶指南 博主id&#xff1a;代码小豪 文章目录 一、文件输入输出函数fwritefread 二、文件定位函数文件位置fseekftellrewind 三、文件缓冲区fflush 一、文件输入输出函数 这些函数用于文件流&#xff0c;主要功能是将一连串的数据输出或输入&am…

python24.1.13for循环

对列表、字典、字符串等进行迭代 range

关系型数据库和MySQL概述

关系型数据库概述 数据持久化 - 将数据保存到能够长久保存数据的存储介质中,在掉电的情况下数据也不会丢失。数据库发展史 - 网状数据库、层次数据库、关系数据库、NoSQL 数据库、NewSQL 数据库。1970年,IBM的研究员E.F.Codd在_Communication of the ACM_上发表了名为_A Rela…

可盐可甜的红色马甲背心

膨体棉腈面料不易皱&#xff0c;搭配阿兰花菱形镂空设计 真的绝绝子&#xff0c;红色吸睛又美观 随便搭配一件衬衫去穿&#xff0c;自带文艺气息 氛围感直接拉满 出街拍照很出片&#xff0c;时髦又气质 女孩子的甜美&#xff0c;温柔等都可以突显 有喜欢的可以尝试一下哟…

Java课程设计团队博客 —— 基于网页的时间管理系统

博客目录 1.项目简介2.项目采用的技术3.功能需求分析4.项目亮点5.主要功能截图6.Git地址7.总结 Java团队博客分工 姓名职务负责模块个人博客孙岚组长 资源文件路径和tomcat服务器的相关配置。 前端的页面设计与逻辑实现的代码编写。 Servlet前后端数据交互的编写。 用户登录和…