向具有大量内存和电源的32位及更高处理器的转变,使公司能够在嵌入式开发中构建更多的增值功能和能力;这就是好处。缺点是,代码的数量及其复杂性通常会导致影响应用程序安全性和安全性的故障。
是时候采取更好的方法了。可以在软件中找到两种关键类型的错误,并使用防止引入错误的工具来解决:
编码错误:例如,试图访问数组边界之外的代码。这类问题可以通过执行静态分析来检测。
应用程序错误:只有准确地知道应用程序应该做什么才能检测到这些错误,这意味着根据需求进行测试。
解决这些错误,设计工程师将在通往更安全的代码的道路上走很长的路。
1. 通过代码检查进行一点点预防
代码中的错误与电子邮件和即时消息中的错误一样容易发生。这些都是发生的简单错误,因为工程师们很匆忙,没有校对。但随着复杂性的增加,出现了一系列设计错误,这些错误带来了巨大的挑战。复杂性催生了对系统如何工作、数据如何传递以及值如何定义的全新理解。无论错误是由复杂性还是嵌入式开发人员的人为问题引起的,它们都可能导致一段代码试图访问数组边界之外的值。而且,编码标准捕捉到了这一点。
在C和C++世界中,80%的软件缺陷是由错误或不明智的使用造成的20%的语言。编码标准对已知存在问题的语言部分进行了限制。结果:避免了缺陷,大大提高了软件质量。
大多数C和C++编程错误是由未定义的、实现定义的和未指定的行为引起的,这些行为是每个语言固有的,这导致软件错误和安全问题。当有符号整数右移时,此实现定义的行为传播高阶位。根据编译器工程师的使用,结果可能是0x40000000或0xC0000000,因为C没有指定函数参数的求值顺序。
C/C++语言中还有很多其他缺陷:使用goto或malloc等构造;有符号和无符号值的混合;或者是“聪明”的代码,可能效率高、结构紧凑,但却非常神秘和复杂,以至于其他人难以理解。这些问题中的任何一个都可能导致缺陷、突然变为负面的值溢出,或者使代码无法维护。
编码标准为这些疾病提供了预防措施。它们可以防止使用这些有问题的构造,防止嵌入式开发人员创建未记录的、过于复杂的代码,以及检查样式的一致性。甚至可以监视诸如验证未使用制表符或圆括号位于特定位置之类的事情。虽然这看起来很简单,但遵循这种风格可以极大地帮助手动代码审阅,并防止在另一个编辑器中查看代码时由于不同的选项卡大小而导致的混乱—所有这些都会分散审阅者对代码的注意力。
2. MISRA去营救
最著名的编程标准是MISRA指南,现在被许多提供某种程度MISRA检查的嵌入式编译器普遍采用。MISRA专注于C语言和C++语言中的问题构造和实践,推荐使用一致的文体特征,同时停止建议。
大多数MISRA指南是“可判定的”,这意味着该工具可以识别是否存在违规行为;但有些是“不可判定的”,这意味着工具并不总是能够推断是否存在违规行为。
如果静态分析工具无法访问系统函数的源代码,则传递给应该初始化它的系统函数的未初始化变量可能不会注册为错误。有可能出现假阴性或假阳性。
编码标准的严格性传统上与汽车、飞机和医疗设备等关键应用的功能安全软件相关联。然而,代码的复杂性、安全性的重要性以及创建易于维护和升级的高质量、健壮代码的业务重要性使得编码标准在所有开发操作中都至关重要。
通过确保错误不会首先引入到代码中,嵌入式开发人员必须:减少了大量调试的需要,更好地控制进度,以及通过降低总体成本来控制投资回报率。
3. 用测试工具进行的一磅治疗
虽然代码检查解决了许多问题,但应用程序错误只能通过测试产品是否做了它应该做的事情来发现,这意味着有需求。要避免应用程序错误,既需要设计正确的产品,也需要设计正确的产品。
设计正确的产品意味着预先建立需求,并确保需求和源代码之间的双向可追溯性,以便实现每个需求,并将每个软件功能追溯到需求。任何不符合要求的缺失或不必要的功能都是应用程序缺陷。产品权利设计是确认开发的系统代码满足项目要求的过程。您可以通过执行基于需求的测试来实现这一点。
4. 编码的新习惯
毫无疑问,软件复杂性及其错误随着连接性、更快的内存、丰富的硬件平台和特定的客户需求而激增。采用最先进的编码标准、度量代码的指标、跟踪需求以及实施基于需求的测试,为开发团队提供了创建高质量代码和减少责任的机会。
在没有标准要求遵守的情况下,团队采用这些新习惯的程度取决于公司对它们带来的游戏变化的认可程度。采用这些实践,无论产品是安全关键的还是安全关键的,都会使代码的可维护性和健壮性日夜不同。干净的代码简化了新功能的添加,简化了产品维护,并将成本和进度保持在最低限度—所有这些特性都可以提高公司的投资回报率。
无论产品是否安全关键,这肯定是一个只能对嵌入式开发团队有益的结果。
发表评论 取消回复