本文将介绍如何避免那些隐藏但常见的错误,并介绍几种技术来帮助工程师在软件中查找隐藏的错误。大多数软件开发项目都依赖于代码检查,结构测试和功能测试的组合来识别软件缺陷。尽管这些传统技术非常重要并且可以找到大多数软件问题,但是它们无法检测出当今复杂系统中的许多常见错误。结构测试或白盒测试可以有效地发现代码中的逻辑,控制流,计算和数据错误。为了理解软件结构的细节,该测试需要对软件的内部工作的完整概述(因此被称为“白盒”或“玻璃盒”)。它检查每个条件表达式,数学运算,输入和输出。由于需要测试许多细节,因此结构测试会一次检查一个软件单元,通常是一个功能或一个类。代码审查还使用与实现缺陷和潜在问题发现相同的复杂技术。像白盒测试一样,通常对软件的每个单元进行检查,因为有效的检查过程需要集中且详细的检查。与审阅和白盒测试不同,功能测试或黑盒测试假定对软件的实现一无所知。它测试由受控输入驱动的输出。功能测试由测试人员或开发人员编写的测试程序组成。它们指定与一组特定程序输入相对应的预期程序输出。运行测试后,测试人员将实际输出与预期输出进行比较以发现问题。黑盒测试可以在程序最常用的功能中有效地发现未满足的需求,接口问题,性能问题和错误。尽管结合使用这些技术可以发现特定软件程序中隐藏的大多数错误,但它们也有局限性。代码审查和白盒测试一次只针对一小部分代码,而忽略了系统的其余部分。黑匣子测试通常将系统视为一个整体,而忽略了实现细节。一些重要的问题只能通过关注它们在整个系统中的交互作用的细节来发现。传统方法无法可靠地识别这些问题。必须从整体上检查软件系统,以找到导致特定问题的特定原因。由于通常不可能彻底分析程序中的每个细节及其与代码的所有其他部分的交互,因此分析应针对已知会引起问题的程序的特定方面。本文将探讨三个潜在的问题领域:*堆栈溢出*竞争条件*死锁读者可以在线阅读本文的第二部分,它将探讨以下问题:*时间问题*可重入条件在多任务实战中的使用时间以上所有问题在设计技术系统中都很常见。堆栈溢出处理器使用堆栈来存储临时变量,将参数传递给所调用的函数,保存线程“状态”等等。如果系统不使用虚拟内存(换句话说,它无法将内存页面传输到磁盘上以释放内存空间供其他用途),则堆栈在出厂时将固定为产品的大小。如果由于某种原因堆栈超出了程序员分配的范围,则程序将变得不确定。这种不稳定性可能会导致严重的系统故障。因此,重要的是要确保系统在最坏的情况下可以分配足够的堆栈。确保永不发生堆栈溢出的唯一方法是分析代码,在所有可能的情况下确定程序的最大堆栈使用率,然后检查是否分配了足够的堆栈。该测试不太可能触发瞬时输入的特定组合并导致系统中最坏的情况。堆栈深度分析的概念相对简单:1.为每个独立线程创建一个调用树。 2.确定调用树中每个函数的堆栈使用情况。 3.检查每个呼叫树以确定从树的根到外部“叶”的哪个呼叫路径。需要最多的堆栈。 4.添加每个独立线程调用树的最大堆栈使用率。 5.确定每个中断优先级中每个中断服务程序(ISR)的最大堆栈使用量,然后计算总数。但是,如果ISR本身没有堆栈,而是使用被中断线程的堆栈,则应将ISR使用的最大堆栈数添加到每个线程的堆栈中。 6.对于每个优先级,添加中断发生时用于保存处理器状态的堆栈数。 7.如果使用RTOS,请添加以下项所需的最大堆栈数: