达内教育的老师说,MISRA (The Motor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商.其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件.这个组织最出名的成果是所谓的MISRA C Coding Standard,这一标准中包括了127条C语言编码标准,通常认为,如果能够完全遵守这些标准,则你的C代码是易读、可靠、可移植和易于维护的.最近很多嵌入式开发者都以MISRA C来衡量自己的编码风格,比如着名的uC/OS-II就得意地宣称自己99%遵守MISRA标准. MISRA C是由汽车产业软件可靠性协会(MISRA)提出的C语言开发标准.其目的是在增进嵌入式系统的安全性及可移植性.MISRA C一开始主要是针对汽车产业,不过其他产业也逐渐开始使用MISRA C:包括航天、电信、国防、医疗设备、铁路等领域中都已有厂商使用MISRA C. 编程标准的目的 程序员对编译器的误解 q C语言中许多地方是未经完善定义的,其实际行为取决于编译器 q "未定义行为"可能会随着编译器的改变而改变 编译器的错误 q 编译器也是软件,也有缺陷 q 对于C的一些难以理解的地方,编译器的编写者很容易错误地解释和实现 操作平台的差异 q 不同的目标平台上表现不一样 运行时错误 q 也许语言本身并没有问题,但某些特殊的数据会在代码运行时产生错误 因此,需要有个编程的标准来保证: 1. 定义一个更安全的C/C++语言子集 2. 提高代码质量 . 可靠性 . 可维护性 . 轻便性 . 可测试性 编程标准 编程标准的基础 v ISO-C:1990 v ISO-C++:2003 常用的编程标准 v C:MISRA C-汽车制造业嵌入式C编程标准 v C++:JSF C++-联合攻击战斗机C++编程标准 HICPP (High Integrity C++)-高可靠性C++编程标准 MISRA C++– 汽车制造业嵌入式C++编程标准
v 行业标准:GJB 5369– 航天型号C语言安全子集
MISRA C概述 MISRA = The Motor Industry Software Reliability Association 1,汽车工业软件可靠性联合会–源自于英国政府1990年,成立的"安全IT"计划的一个项目 2,1994年正式独立出来,总部在英国–致力于协助汽车厂商开发安全可靠的软件,MISRA协会在1994 年发布了它的"Development Guidelines for Vehicle Based Software"[9],描述了软件开发过程中所有应该使用的方法集.特别地,在使用中因为考虑安全集成度而做出的语言、编译器和语言特性的选择,成为首要考虑的事情.MISRA 指南[9]中的节3.2.4.3(b)和表3 描述了这些.推荐的方法之一是使用已经应用于航空、能源和国防工业中的标准化的语言子集.本文档定义了这样一个合适的C 语言子集. 3, MISRA-C 的目标,在发布这个关于 C 编程语言使用的文档时,MISRA 协会并没想促进C 在汽车工业中的应用,而是因为认识到了C 的广泛应用.本文档的目标是为了促进该语言的最为安全的使用.MISRA 协会希望本文档能获得工业上的接受,以及对更安全子集的采用能够成为汽车制造业和许多零部件供应商的最佳实践.它也应该为通用C 和该特殊子集的使用增加培训和增强使用能力,无论是在个人层次还是公司范围.大部分重点放在了静态检查工具上以强制对子集的适应,同时希望这也会成为汽车嵌入式系统开发者的普遍实践.尽管许多学术着作对语言及其正反两面做了大量的描述,但这方面信息在汽车开发中还不是广为人知.本文档的另外一个目标就是使汽车工业中的工程师和经理们越来越多地关心语言的选用问题.可以帮助进行软件开发的工具,尤其是支持 C 语言使用的工具对我们来说是个好处.然而,对设计与实现的鲁棒性的关注是始终存在的,特别是对安全相关软件的开发.人们希望汽车工业中正在使用的实现软件最佳实践(通过MISRA 指南[9]和本文档)的方法能鼓励COTS 工具的供应商使用它以保证其产品适合于汽车工业应用. MISRA C 规则实例 声明与定义 规则 8.2(强制): 不论何时声明或定义了一个对象或函数,它的类型都应显式声明. extern x; /* Non-compliant – implicit int type */ extern int16_t x ; /* Compliant – explicit type */ const y ; /* Non-compliant – implicit int type */ const int16_t y ; /* Compliant – explicit type */ static foo (void) ; /* Non-compliant – implicit type */ static int16_t foo (void) ; /* Compliant – explicit type */ 指针类型转换 规则11.5(强制): 如果指针所指向的类型带有const 或volatile 限定符,那么移除限定符的强制转换是不允许的.[未定义 39、40]任何通过强制转换移除类型限定符的企图都是对类型限定符规则的违背.注意,这里所指的限定符与任何可以应用在指针本身的限定符不同. uint16_t x; uint16_t * const cpi = &x; /* const pointer */ uint16_t * const * pcpi ; /* pointer to const pointer */ const uint16_t * * ppci ; /* pointer to pointer to const */ uint16_t * * ppi; const uint16_t * pci; /* pointer to const */ volatile uint16_t * pvi; /* pointer to volatile */ uint16_t * pi; … pi = cpi; /* Compliant – no conversion no cast required */ pi = (uint16_t *)pci; /* Not compliant */ pi = (uint16_t *)pvi ; /* Not compliant */ ppi = (uint16_t *)pcpi ; /* Not compliant */ ppi = (uint16_t *)ppci ; /* Not compliant */ 表达式 规则 12.3(强制): 不能在具有副作用的表达式中使用sizeof 运算符.C 当中存在的一个可能的编程错误是为一个表达式使用了sizeof 运算符并期望计算表达式.然而表达式是不会被计算的:sizeof 只对表达式的类型有用.为避免这样的错误,sizeof 不能用在具有副作用的表达式中,因为此时其副作用不会发生.例如: int32_t i; int32_t j; j = sizeof (i = 1234); /* j is set to the sizeof the type of i which is an int */ /* i is not set to 1234 */ 以上就是达内教育给大家做的内容详解,更多关于C++的学习,请继续关注达内教育
达内教育的老师说,MISRA (The Motor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商.其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件.这个组织最出名的成果是所谓的MISRA C Coding Standard,这一标准中包括了127条C语言编码标准,通常认为,如果能够完全遵守这些标准,则你的C代码是易读、可靠、可移植和易于维护的.最近很多嵌入式开发者都以MISRA C来衡量自己的编码风格,比如着名的uC/OS-II就得意地宣称自己99%遵守MISRA标准. MISRA C是由汽车产业软件可靠性协会(MISRA)提出的C语言开发标准.其目的是在增进嵌入式系统的安全性及可移植性.MISRA C一开始主要是针对汽车产业,不过其他产业也逐渐开始使用MISRA C:包括航天、电信、国防、医疗设备、铁路等领域中都已有厂商使用MISRA C. 编程标准的目的 程序员对编译器的误解 q C语言中许多地方是未经完善定义的,其实际行为取决于编译器 q "未定义行为"可能会随着编译器的改变而改变 编译器的错误 q 编译器也是软件,也有缺陷 q 对于C的一些难以理解的地方,编译器的编写者很容易错误地解释和实现 操作平台的差异 q 不同的目标平台上表现不一样 运行时错误 q 也许语言本身并没有问题,但某些特殊的数据会在代码运行时产生错误 因此,需要有个编程的标准来保证: 1. 定义一个更安全的C/C++语言子集 2. 提高代码质量 . 可靠性 . 可维护性 . 轻便性 . 可测试性 编程标准 编程标准的基础 v ISO-C:1990 v ISO-C++:2003 常用的编程标准 v C:MISRA C-汽车制造业嵌入式C编程标准 v C++:JSF C++-联合攻击战斗机C++编程标准 HICPP (High Integrity C++)-高可靠性C++编程标准 MISRA C++– 汽车制造业嵌入式C++编程标准
v 行业标准:GJB 5369– 航天型号C语言安全子集
MISRA C概述 MISRA = The Motor Industry Software Reliability Association 1,汽车工业软件可靠性联合会–源自于英国政府1990年,成立的"安全IT"计划的一个项目 2,1994年正式独立出来,总部在英国–致力于协助汽车厂商开发安全可靠的软件,MISRA协会在1994 年发布了它的"Development Guidelines for Vehicle Based Software"[9],描述了软件开发过程中所有应该使用的方法集.特别地,在使用中因为考虑安全集成度而做出的语言、编译器和语言特性的选择,成为首要考虑的事情.MISRA 指南[9]中的节3.2.4.3(b)和表3 描述了这些.推荐的方法之一是使用已经应用于航空、能源和国防工业中的标准化的语言子集.本文档定义了这样一个合适的C 语言子集. 3, MISRA-C 的目标,在发布这个关于 C 编程语言使用的文档时,MISRA 协会并没想促进C 在汽车工业中的应用,而是因为认识到了C 的广泛应用.本文档的目标是为了促进该语言的最为安全的使用.MISRA 协会希望本文档能获得工业上的接受,以及对更安全子集的采用能够成为汽车制造业和许多零部件供应商的最佳实践.它也应该为通用C 和该特殊子集的使用增加培训和增强使用能力,无论是在个人层次还是公司范围.大部分重点放在了静态检查工具上以强制对子集的适应,同时希望这也会成为汽车嵌入式系统开发者的普遍实践.尽管许多学术着作对语言及其正反两面做了大量的描述,但这方面信息在汽车开发中还不是广为人知.本文档的另外一个目标就是使汽车工业中的工程师和经理们越来越多地关心语言的选用问题.可以帮助进行软件开发的工具,尤其是支持 C 语言使用的工具对我们来说是个好处.然而,对设计与实现的鲁棒性的关注是始终存在的,特别是对安全相关软件的开发.人们希望汽车工业中正在使用的实现软件最佳实践(通过MISRA 指南[9]和本文档)的方法能鼓励COTS 工具的供应商使用它以保证其产品适合于汽车工业应用. MISRA C 规则实例 声明与定义 规则 8.2(强制): 不论何时声明或定义了一个对象或函数,它的类型都应显式声明. extern x; /* Non-compliant – implicit int type */ extern int16_t x ; /* Compliant – explicit type */ const y ; /* Non-compliant – implicit int type */ const int16_t y ; /* Compliant – explicit type */ static foo (void) ; /* Non-compliant – implicit type */ static int16_t foo (void) ; /* Compliant – explicit type */ 指针类型转换 规则11.5(强制): 如果指针所指向的类型带有const 或volatile 限定符,那么移除限定符的强制转换是不允许的.[未定义 39、40]任何通过强制转换移除类型限定符的企图都是对类型限定符规则的违背.注意,这里所指的限定符与任何可以应用在指针本身的限定符不同. uint16_t x; uint16_t * const cpi = &x; /* const pointer */ uint16_t * const * pcpi ; /* pointer to const pointer */ const uint16_t * * ppci ; /* pointer to pointer to const */ uint16_t * * ppi; const uint16_t * pci; /* pointer to const */ volatile uint16_t * pvi; /* pointer to volatile */ uint16_t * pi; … pi = cpi; /* Compliant – no conversion no cast required */ pi = (uint16_t *)pci; /* Not compliant */ pi = (uint16_t *)pvi ; /* Not compliant */ ppi = (uint16_t *)pcpi ; /* Not compliant */ ppi = (uint16_t *)ppci ; /* Not compliant */ 表达式 规则 12.3(强制): 不能在具有副作用的表达式中使用sizeof 运算符.C 当中存在的一个可能的编程错误是为一个表达式使用了sizeof 运算符并期望计算表达式.然而表达式是不会被计算的:sizeof 只对表达式的类型有用.为避免这样的错误,sizeof 不能用在具有副作用的表达式中,因为此时其副作用不会发生.例如: int32_t i; int32_t j; j = sizeof (i = 1234); /* j is set to the sizeof the type of i which is an int */ /* i is not set to 1234 */ 以上就是达内教育给大家做的内容详解,更多关于C++的学习,请继续关注达内教育