软件|嵌入式开发:开发新的编码习惯以减少嵌入式软件中的错误

软件|嵌入式开发:开发新的编码习惯以减少嵌入式软件中的错误

文章图片


向具有大量内存和电源的32位及更高处理器的转变 , 使公司能够在嵌入式开发中构建更多的增值功能和能力;这就是好处 。 缺点是 , 代码的数量及其复杂性通常会导致影响应用程序安全性和安全性的故障 。
是时候采取更好的方法了 。 可以在软件中找到两种关键类型的错误 , 并使用防止引入错误的工具来解决:
编码错误:例如 , 试图访问数组边界之外的代码 。 这类问题可以通过执行静态分析来检测 。
应用程序错误:只有准确地知道应用程序应该做什么才能检测到这些错误 , 这意味着根据需求进行测试 。
解决这些错误 , 设计工程师将在通往更安全的代码的道路上走很长的路 。
1.通过代码检查进行一点点预防
【软件|嵌入式开发:开发新的编码习惯以减少嵌入式软件中的错误】代码中的错误与电子邮件和即时消息中的错误一样容易发生 。 这些都是发生的简单错误 , 因为工程师们很匆忙 , 没有校对 。 但随着复杂性的增加 , 出现了一系列设计错误 , 这些错误带来了巨大的挑战 。 复杂性催生了对系统如何工作、数据如何传递以及值如何定义的全新理解 。 无论错误是由复杂性还是嵌入式开发人员的人为问题引起的 , 它们都可能导致一段代码试图访问数组边界之外的值 。 而且 , 编码标准捕捉到了这一点 。
在C和C++世界中 , 80%的软件缺陷是由错误或不明智的使用造成的20%的语言 。 编码标准对已知存在问题的语言部分进行了限制 。 结果:避免了缺陷 , 大大提高了软件质量 。
大多数C和C++编程错误是由未定义的、实现定义的和未指定的行为引起的 , 这些行为是每个语言固有的 , 这导致软件错误和安全问题 。 当有符号整数右移时 , 此实现定义的行为传播高阶位 。 根据编译器工程师的使用 , 结果可能是0x40000000或0xC0000000 , 因为C没有指定函数参数的求值顺序 。
C/C++语言中还有很多其他缺陷:使用goto或malloc等构造;有符号和无符号值的混合;或者是“聪明”的代码 , 可能效率高、结构紧凑 , 但却非常神秘和复杂 , 以至于其他人难以理解 。 这些问题中的任何一个都可能导致缺陷、突然变为负面的值溢出 , 或者使代码无法维护 。

编码标准为这些疾病提供了预防措施 。 它们可以防止使用这些有问题的构造 , 防止嵌入式开发人员创建未记录的、过于复杂的代码 , 以及检查样式的一致性 。 甚至可以监视诸如验证未使用制表符或圆括号位于特定位置之类的事情 。 虽然这看起来很简单 , 但遵循这种风格可以极大地帮助手动代码审阅 , 并防止在另一个编辑器中查看代码时由于不同的选项卡大小而导致的混乱—所有这些都会分散审阅者对代码的注意力 。
2.MISRA去营救
最著名的编程标准是MISRA指南 , 现在被许多提供某种程度MISRA检查的嵌入式编译器普遍采用 。 MISRA专注于C语言和C++语言中的问题构造和实践 , 推荐使用一致的文体特征 , 同时停止建议 。
MISRA指南提供了关于每个规则存在原因的有用解释 , 以及该规则的各种例外情况的详细信息 , 以及未定义、未指定和实现定义行为的示例 。
大多数MISRA指南是“可判定的” , 这意味着该工具可以识别是否存在违规行为;但有些是“不可判定的” , 这意味着工具并不总是能够推断是否存在违规行为 。
如果静态分析工具无法访问系统函数的源代码 , 则传递给应该初始化它的系统函数的未初始化变量可能不会注册为错误 。 有可能出现假阴性或假阳性 。