在实验室中有效的方法并不总是在现场工作,通常是由于意外的交互和未发现的错误。防御性编程可以帮助提高设计的弹性,但开发能够处理不可预见情况的嵌入式软件并非易事;它需要纪律和深谋远虑。以下是帮助开发人员成为更好的防御性程序员的五个技巧。
技巧1 -校验和或CRC数据
使用校验和和循环冗余校验( CRC)算法是开发人员验证通过串行链路发送的数据确实正确的好方法。经过审查的嵌入式系统在测试台的受控环境中始终表现如预期。然而,一旦系统被释放到野外,系统运行的环境就变得非常未知。嘈杂的环境可能会产生通信噪声,导致位翻转和误读数据。检测此损坏数据的最佳希望是通过使用校验和或CRC对数据进行健全性检查。
提示2 -按合同设计
按合同设计是一种开发软件的方法,可以生成高度定义的软件界面,每个函数都与之相关联具有明确的前提条件和后置条件。我们的想法是,如果应用程序要调用特定函数,则调用应用程序必须满足函数的前置条件才能获得有效的响应或操作。按合同设计对开发人员来说可能是一个强大的工具,因为它明确指定了函数期望接收的内容以及有效前置条件下的保证输出。由于期望不是“在线之间读取”,因此调用该函数的开发人员确切地知道了使用该函数的期望是什么。
技巧3 -使用断言
断言宏是开发人员验证其应用假设的好方法在应用程序中的给定点。断言的使用对于在bug发生时捕获程序中的错误和意外行为非常有用。断言甚至可以在契约式设计环境中使用,以验证合同的前提条件和后置条件是否已得到满足。有关在嵌入式软件中使用断言的介绍,请考虑阅读8个使用C中的断言和何时断言或不断言来压缩错误的提示。
提示4 -检查指针和缓冲区
指针和缓冲区是开发人员似乎总是遇到麻烦的两个地方。在C中开发嵌入式系统时,很容易意外地取消引用NULL指针或溢出缓冲区。防御程序员应该在取消引用之前检查指针的有效性。指针是否为NULL?不要去除它!存储在指针中的值是否为有效值?如果是,则取消引用。
指针算法和数组的使用也很危险。开发人员应该在缓冲区和指针算术运算中添加边界检查,以确保结果保留在它们应该的内存空间内。意外地仅通过一个字节覆盖内存可能会对嵌入式系统产生灾难性后果,更重要的是会对其用户造成灾难性后果。
提示5 -使用堆栈监视器
执行最坏情况的堆栈分析并正确调整堆栈大小是一项艰巨的任务。通常,堆栈的大小要么保留在编译器的默认设置中,要么开发人员在一张纸上写下几个可能的值并使用“eeny meeny miny moe”技术。这两种技术都不够,堆栈溢出的最坏情况成为现实。
开发人员可以通过监视此类事件来帮助防止堆栈溢出。大多数实时操作系统都内置了堆栈监视器。启用堆栈监视器只不过是使用RTOS的配置调整宏。在裸机系统中,开发人员需要更加积极主动,并且要么自己编写堆栈监视器,要么使用可以在Internet上找到的许多可用堆栈监视器之一。要了解有关堆栈监视器的更多信息,请考虑通过七个简单步骤阅读创建堆栈监视器并使用堆栈防护改进代码完整性
最后的想法
这五个技巧只是开发人员如何通过防御性编程改进嵌入式软件的几个例子。还有许多其他技术,例如编写安全代码和加密数据,这些技术可以帮助提高嵌入式系统即使在不可预见的情况下也能继续运行的机会。
-
程序员
+关注
关注
4文章
949浏览量
29761 -
PCB打样
+关注
关注
17文章
2968浏览量
21652 -
华强PCB
+关注
关注
8文章
1831浏览量
27720 -
华强pcb线路板打样
+关注
关注
5文章
14629浏览量
42980
发布评论请先 登录
相关推荐
评论