由于嵌入式系统行业的快速发展,嵌入式设备的代码质量成为首要关注的问题之一。考虑到嵌入式系统开发的特殊性(调试困难、出错成本高等),嵌入式开发者需要使用专门的工具来增强自己的代码质量。
静态代码分析器就是这些工具之一,本文描述了静态分析及其在嵌入式系统中的优势。
静态代码分析
首先,让我们弄清楚什么是静态代码分析器,它们可以执行什么功能。
静态代码分析器是分析程序而不实际执行它的软件,静态分析工具比编译器对源代码进行更深入的检查。通常,编译器只会发现语法错误。
静态分析工具如何工作:
分析器的输入数据是源代码(最好是可编译的)
分析器将源代码转换为一个特殊的模型以供进一步分析(AST、语义模型等);
分析器通过将一组诊断规则应用于模型来搜索缺陷,诊断规则基于各种方法;
分析仪以你方便的格式保存所有发出的警告;
开发人员只需研究报告并修复所有缺陷;
静态分析仪可以执行各种任务。让我们介绍一下分析仪最常见的任务:
程序代码中的错误检测。在这种情况下,静态分析极大地补充了代码审查。它可以让嵌入式开发人员在代码审查之前发现并解决一些问题;
广义的代码质量增强。代码质量可以包括可读性、可维护性、代码复杂性、内聚程度,以及可以直接或间接影响错误数量的其他方面。因此,静态分析器有助于遵循编码标准(公司内部接受和普遍接受);
代码分析是CI/CD中质量关机制的一部分。分析器不仅警告代码中的潜在错误,而且还起到保护机制的作用。如果代码质量水平不符合规定要求,他们将停止连续交付。如果这些代码分析器检测到不符合标准的错误或代码片段,则会扩展编译器行为并阻止构建;
收集项目度量、统计数据收集、反映项目“总体健康状况”的图表结构。
实施的好处
静态分析器已被证明对嵌入式软件非常有用,让我们来看看静态分析最明显的积极方面。
1.首先,静态分析的使用减少了昂贵的可能性。
嵌入式系统软件中的错误非常麻烦。问题在于,一旦开始大规模生产,这些错误就不可能或几乎不可能纠正。比方说,一家公司已经生产了数千台洗衣机,并交付给商店。然而,事实证明,机器在某种模式下无法正常工作。公司应该做什么?
所以,嵌入式设备的代码应该尽可能彻底地测试,尤其是在错误可能导致人员伤亡或巨大经济损失的情况下。
静态代码分析是检测错误的过程,但它不保证能找到代码中的所有错误。然而,嵌入式开发人员应该利用任何机会额外检查代码的正确性。静态分析器可以指出各种错误,这些错误甚至在几次代码审查之后仍然存在。
如果静态分析可以帮助减少设备代码中的错误数量,那就太棒了。也许这些特殊错误的发现会阻止生命的损失。或者,这些公司不会浪费很多钱,也不会因为客户投诉而失去好名声。
2.静态代码分析器大大降低了软件测试和调试过程的成本。
静态分析允许你在编码期间或者在夜间构建期间就已经找到bug。因此,搜索和修复大多数错误的成本会低得多。
大概每个开发者都有过不成功的“刷新”设备的尝试。例如,在这个过程中,设备没有设置合适的电压或者完全烧毁。发生了什么,你从哪里寻找问题?毕竟,问题的根源不仅仅是软件错误。这也可能是硬件本身的错误或低质量的布局。因此,查找错误的过程可能需要很长时间。
3.静态分析的使用保证了没有太多经验的开发人员。
程序错误可以形象地分为两种类型。开发者知道第一种类型的错误。由于疏忽,这些错误意外地出现在代码中。第二种错误出现在嵌入式开发人员不知道不可能用这种方式编写代码的情况下。换句话说,他们可以尽可能多地检查这样的代码,但仍然不会发现错误。
静态分析器包含关于各种代码模式的知识库。在某些条件下,这些模式会导致错误。因此,他们可以指出开发人员自己不会发现的错误。一个例子是使用32位time_t类型,这可能导致2038年后设备工作不正确。
另一个例子是程序的未定义行为,这是由于不正确使用移位运算符<</>>而发生的。这些运算符在微控制器的代码中被广泛使用。不幸的是,开发人员经常非常粗心地使用这些运算符。这使得程序不可靠,并且依赖于编译器的特定版本和设置。同时,程序可以运行,但这不是因为代码编写正确,而是因为开发人员很幸运。
使用静态分析器,嵌入式开发人员可以避免许多这种不愉快的情况。此外,你可以使用分析器来控制总体代码质量。当项目团队正在成长或变化时,这一点很重要。换句话说,分析器帮助跟踪初学者是否开始编写错误代码。
4.现代静态分析器不仅发现代码错误和漏洞,而且支持嵌入式系统的编码标准。这些标准提高了程序的安全性、可移植性和可靠性。
C和C++是嵌入式系统的流行编程语言。MISRA C、MISRA C++和AUTOSAR C++等标准是为这些语言开发的。每个标准都有大量的规则和建议(MISRA C:143,MISRA C++:228,AUTOSAR C++:超过350)。在没有静态代码分析器的情况下进行编码时,根本不可能遵守这么多规则和建议。这些规则是开发人员需要避免的编码模式,从而降低出错的可能性。目前,静态分析的所有主要参与者(Coverity、Klockwork、PVS Studio等)都努力尽可能增加标准的覆盖范围。
结论
在嵌入式开发中,使用静态分析器对于任何嵌入式项目都是非常有用的,是否需要静态分析由你决定!