MISRA C学习笔记
一. 2022.12.9
- 为什么使用C语言可能产生错误?
-
常见语法错误:
if(statement); //如果此行加了“;”,那么语义完全改变 do something; //伪代码
if(a = b); //此行如果b的值不为0,及判断为真 if(a == b); //此行能起到判断作用
-
编译器的行为同程序员预期的不同
如果语言具有未经完善定义的特性,或者模糊特性,那么在程序员认为某个构造应该如此时,编译器的解释却是完全不同的
-
编译器包含错误
编译器本身也是一个程序,在对源代码进行解释时,编译器程序中存在对语言标准理解有误的地方,此时编译器存在天生的“bug” -
有些不同的语言问题产生自正确编译的代码,但某些特殊数据会在代码运行时产生错误。语言能够对可执行代码内部做运行时的检查以检测这样的错误并执行适当的动作。
通常,C 的运行时检查能力比较弱。这也是 C 代码短小有效的原因之一,但是在运行中检查错误就要花费一定的价。C 编译器通常不为某些常见问题提供运行时检查,诸如数学异常(如零除)、溢出、指针地址的有效性,或数组越界错误。
- 开发相关——工具和个人软件设计
- 软件工程开发环境、编码语言要尽可能强壮;
- 编译器和静态检查工具要尽可能强壮;
- 源代码复杂度:强烈建议使用源代码的复杂性度量。这可以防止编写出难以控制和难以测试的代码;
- 疑问:
- 什么是子集(subset)?
- 什么是符合性矩阵(Complaince matrix)?
- 什么是背离过程?
上述三个疑问结案可总结出的结论: 项目开发满足符合性矩阵及背离过程规则的要求,对于没有遵循上述规则的实例有对应的说明列表,使用子集来完成项目编写,那么该项目是可靠的,并且具备做大规模集成软件的基础。