标准C编译器的一个问题是,它不寻找程序设计中的潜在缺陷,而只寻找其编码中的缺陷。使用静态代码分析器有助于改进固件并捕捉编译器无法想象的问题。下面是每个嵌入式开发人员都应该熟悉的静态代码分析器的七种用法。
标准C编译器在确定程序中编写的代码是否有效以及是否可以编译成工作程序方面做得很好。但是它假设,如果它能编译代码,那么一切都是好的。这仍然给错误留下了很大的空间。当按如下方式使用时,静态代码分析器可能是一个非常有价值的工具。
用途1——捕捉潜在的错误
静态代码分析器最广为人知的用途之一是扫描软件中的潜在问题和缺陷。这些问题包括从在switch情况下忘记break语句到潜在的缓冲区溢出。静态代码分析器具有发现软件问题的能力,这些问题通常会被编译器和审查代码的工程师所忽略。在实现阶段的早期建立一个静态代码分析器是一个很好的实践,可以确保潜在的问题被立即处理,而不是在开发周期的后期。
用途2——实施编码标准
使用编码标准是确保软件以一致和可读的方式开发的好方法。编码标准不仅会指定可读性的问题,还可以用来实施最佳实践。许多静态代码分析器支持的编码标准的一个很好的例子是MISRA C。静态代码分析器可用于确保嵌入式开发人员没有违反标准的大多数建议或最佳实践(然而,一些规则需要视觉检查,并且不能自动确定合规性)。如果发生了违规,静态分析器将向开发人员报告违规情况,并采取纠正措施。使用静态分析器来执行编码标准的结果是快速确定代码是否遵循定义的标准。
用途3——支持严格遵守ANSI-C标准
关心编写符合ANSI-C标准的可移植软件的开发人员可以使用静态分析器来确定是否使用了任何非标准语言功能。将分析器设置为“strict”将会确定感兴趣的领域,在这些领域中,对不同编译器或平台的可移植性可能会成为一个问题。然后,开发人员可以检查这些区域并改进软件,以更好地符合ANSI-C标准,或者至少记录软件的哪些区域可能需要额外的移植工作。
用途4——执行强类型检查
C编程语言不支持强类型检查。在C中,如果开发人员要创建自己的类型,编译器将忽略新类型,而使用基础C类型。
用途5——提供尺寸检查
C编程语言无法提供任何类型的量纲分析来确保计算的一致性。然而,静态代码分析器可以执行这些检查,并确保千米不会意外地乘以英尺而产生错误的结果。量纲分析的设置因工具而异,但这是开发人员应该利用的一个重要特性。
用途6——支持基本堆栈分析
嵌入式开发人员了解最坏情况下的堆栈使用对于开发任何基于实时的嵌入式系统都至关重要。有许多方法可以分析和确定最坏情况下的堆栈使用情况,但是开始了解堆栈使用情况的一种方法是使用静态代码分析器。静态分析器可以计算一个函数的堆栈使用和调用图,以提供关于堆栈需要多深的基本感觉。静态分析器工具还可以提供对程序函数如何使用以及它们是否被认为是确定性的洞察。使用静态分析器来了解堆栈使用情况和最坏情况函数是理解最坏情况堆栈分析的良好开端。
用途7——辅助线程检查
静态分析工具也可用于识别处理器上同时运行的线程和任务的问题。例如,一个分析工具可以识别是否有任何与锁定或解锁互斥体相关的异常。线程检查对于识别实时系统中的问题是非常有用的工具,但是这种分析的设置通常并不简单。尽管如此,设置工作对于发现难以捉摸或异常的线程事件还是很有价值的。
结论
对于希望开发实时系统的嵌入式开发人员来说,静态分析是一个无价的工具。静态分析器的这七种用途只是许多可用分析工具中强大特性的几个例子。使用静态代码分析器可以极大地提高代码库的质量和健壮性,如果设置得当,甚至可以确保与众所周知的或定制的编码标准的一致性和一致性。