目前的标准C语言编译器只能发现代码中潜在的缺陷,而在程序设计中效果不佳。 使用静态代码分析器可以帮助改进固件并捕获编译器难以检测到的问题。 以下是每个嵌入式软件开发工程师都应该熟悉的静态代码编译器的七种用途。 赶紧跟随《单片机与嵌入式系统应用》小编来看看吧!
标准 C 编译器可以很好地检查语法错误并将其编译为可执行程序。 如果代码编译成功,编译器会认为一切正常,但仍然可能有很多错误。 静态代码分析器可以在以下场景中发挥作用。
目的#1 - 发现潜在的漏洞
静态代码分析器的众所周知的用途之一是扫描软件是否存在潜在的问题和漏洞。 这些问题的范围从案例中省略break语句到缓冲区溢出的潜在风险。 静态代码分析器可以发现编译器或代码审查者容易忽视的问题。 在开发的早期阶段配置静态代码分析器实际上可以确保立即解决潜在风险,而不是等到开发的后期阶段。
目的#2 - 执行编码标准
执行代码规范是确保软件开发一致性和代码可读性的重要步骤。 代码规范不仅涉及代码可读性等问题,而且还强制代码必须优雅。 一个典型的例子是,很多静态代码分析器都支持MISRA C。静态代码分析器可以保证开发人员不违反大多数推荐的实现方法,也不违反标准的优雅实践(但有些规则需要人工检查,机器无法自动判断)。 如果确实发生违规,静态分析器会将违规报告给开发人员,开发人员可以纠正它。 使用静态分析器快速确定您的代码是否遵循定义的标准。
目的#3 - 确保严格执行 ANSI-C 标准
想要开发严格遵守 ANSI-C 标准的可移植软件的开发人员可以使用静态代码分析器来确定代码中是否混有非标准用法。 将分析器设置为“”将找到可移植性较差或兼容性较差的代码区域。 然后开发人员可以仔细检查这部分代码,以使软件更好地符合 ANSI-C 标准,或者至少在文档中记下这部分代码。
使用 #4 - 强大的类型检查
C语言不支持强类型检查。 在 C 中,如果开发人员创建类型,编译器会忽略新类型并使用底层 C 类型。
例如,如上图所示,编译器会将变量 Var1 视为 int 类型(在实现时定义),而不是新类型。 开发人员可能希望区分 int 和这两种类型,并在两者混合时让编译器发出警告。 然而,在第13行,编译器并不认为将变量Var2(底层类型为int)的值赋给变量Var1(底层类型也是int)有什么问题。 静态代码分析器可以设置严格的类型检查,突出显示由于不同类型之间赋值而导致的Var1=Var2,并检测其他不符合开发人员意图的问题。
使用 #5 - 提供尺寸检查
1998年火星气候轨道飞行器发射失败是我最关心的飞机失事事件之一。 飞机失败的原因是在输入轨道插入参数时使用了非标准的 lbs*s 而不是 N*s(哎呀!)。 火星气候轨道器的损失永久提醒我们正确测量的重要性。 但C编程语言不提供任何量纲分析来保证计算的一致性。 但是,静态代码分析器可以完成这些检查,以确保您不会错误地将公里乘以英尺并得到错误的结果。 维度分析设置因工具而异,但开发人员应该利用这一重要功能。
使用 #6 - 支持基本堆栈分析
了解堆栈的最坏情况使用场景是开发任何实时嵌入式系统的关键。 有很多方法可以分析和确定最坏情况的堆栈使用情况,但您可以使用静态代码分析器来了解合理的堆栈使用情况。 静态分析器可以计算函数的堆栈使用情况和调用图,以给出堆栈所需的大致空间量。 静态分析工具还可以帮助深入了解程序的函数调用和函数结果的确定性。 使用静态分析来熟悉堆栈的使用及其最坏情况工作状态,有助于初步了解堆栈的最坏情况分析。
使用 #7 - 帮助检查线程
静态分析工具还可用于查看在同一处理器上同时执行的线程和任务的问题。 例如,分析工具可以识别是否存在与锁定或解锁互斥体相关的任何异常。 线程检查对于发现实时系统中的问题非常有效,但配置此类分析的成本很高。 只要能够找到异常线程,付出的代价就是值得的。
总结
静态分析对于开发实时系统的开发人员来说是一个很有价值的工具。 静态分析仪的七种用途只是其强大功能的几个例子。 使用静态代码分析器可以极大地提高代码的质量和健壮性,如果设置正确,甚至可以确保代码符合通用或自定义编码标准。