经过将近6节课、10个小时的培训,持续一个半月的MISRA-C编程规则培训已经结束。
MISRA-C:关键系统中C语言使用的一份指导性子集。规则14.7 (强制): 一个函数在其结尾应该有单一的退出点;
其实,接触MISRA-C也才是近3个月的事情。因为刚才加工作,以前也没有接触过安全性相关的软件编程规则,在领导的安排下学习,利用配套的静态测试工具TestBed学习了将近一个月,期间还编写了相关的代码模版供公司技术人员参考。对于我来说,自我学习还好,但是涉及到给同事培训,感觉就很有压力了。首先,你需要整理资料,制作相关PPT;其次,在培训过程中,你需要将拗口的翻译解释成通俗易懂的语句。对于这些规则尤其如此,对原文要不断的推敲,我觉得在此过程中,我对于某些规则的文字真正是做到的“咬文嚼字”了。最令人崩溃的是MISRA-C在2007年还有一份《MISRA-C:2004 technical corrigendum》,关于MISRA-C:2004中某些规则的澄清,然而TestBed实现的却是MISRA-C:2004原来的规则,并没有覆盖2007给出的技术澄清。
在培训的过程中,本人发现要完全不违反MISRA-C的规则是非常困难的,在这里本人给出简单的几条规则仅供参考:
规则17.4 (强制): 数组的索引应当是指针数学运算的唯一可允许的方式;
此规则一出,让指针对象的用法仅仅局限在读写了;按照官方的解释,任何对指针对象的运算都是违反本条规则的,就连号称99%符合MISRA-C规则的ucos-II也在本规则的铁蹄下跪倒。“任何显式计算的指针值潜在地会访问不希望访问的或无效的内存地址”,只此一句让我们的C语言程序员们毫无办法。如下例子,很不幸,“p[1]=5”和"p++"是违反规则的。
{
int a[10] = {0};
int *p = a;
p++;
p[1] = 5;
}
规则14.7 (强制): 一个函数在其结尾应该有单一的退出点;
这条规则也是IEC 61508(一份国际标准)给出的一份编程规则。此规则简单点说让我们永远只有一个return,你如果想早点结束你的函数块是不行的。
当然,类似这些与我们常用习惯相悖的规则还有一些,但是规则永远仅仅是规则,它是来为我们服务的,而不是来限制我们的。所以各个公司在使用MISRA-C时都会基于此基础上得出一份自己公司的子集供使用。