嵌入式系统开发中的静态分析

描述

  由于嵌入式系统行业的快速增长,嵌入式设备的代码质量成为主要关注点之一。考虑到嵌入式系统开发的特殊性(调试难度大、出错成本高等),开发人员需要使用专用工具来提升代码质量。

  静态代码分析器是这些工具之一。本文介绍静态分析及其在嵌入式系统中的优势。

  静态代码分析

  首先,让我们弄清楚什么是静态代码分析器以及它们可以执行哪些功能。

  静态代码分析器是一种分析程序而不实际执行程序的软件。静态分析工具比编译器对源代码执行更深入的检查。通常,编译器只发现语法错误。

  静态分析工具的工作原理:

  分析器的输入数据是源代码(最好是可编译的)

  分析器将源代码转换为特殊模型以供进一步分析(AST、语义模型等);

  分析器通过将一组诊断规则应用于模型来搜索缺陷。诊断规则基于各种方法;

  分析器以您方便的格式保存所有发出的警告;

  开发人员只需要研究报告并修复所有缺陷;

  利润!

  静态分析仪可以执行广泛的任务。让我们介绍分析器最常见的任务:

  程序代码中的错误检测。在这种情况下,静态分析极大地补充了代码审查。它允许您在您和您的同事开始烦人的代码审查之前找到并修复许多问题;

  广义上的代码质量增强。代码质量可以包括可读性、可维护性、代码复杂性、内聚级别以及可能直接或间接影响错误数的其他方面。因此,静态分析仪有助于遵循编码标准(公司内部接受和普遍接受);

  代码分析作为 CI/CD 中质量门机制的一部分。分析器不仅可以警告代码中的潜在错误,还可以用作保护机制。如果代码质量级别不符合指定的要求,它们将停止持续交付。此类代码分析器扩展编译器行为,并在检测到不符合标准的错误或代码片段时阻止生成;

  收集项目指标,收集统计数据,反映项目“总体健康状况”的图形和图表结构。

  实施的好处

  事实证明,静态分析仪对于嵌入式软件非常有用。让我们来看看静态分析最明显的积极方面。

  首先,静态分析的使用降低了已经发布的设备“闪烁”的昂贵(如果不是不可能的话)的可能性。

  嵌入式系统软件中的错误非常麻烦。问题在于,一旦开始批量生产,错误就不可能或几乎不可能纠正。假设一家公司已经生产并交付了数千台洗衣机。但是,事实证明机器在特定模式下无法正常工作。公司应该怎么做?一般来说,这个问题是修辞性的,有两种真正的选择:

  顺其自然,在各种网站上收到负面的客户反馈,并破坏声誉。当然,公司可以发布并发送手册添加说“不要这样做”。然而,这是一个“弱”的选择;

  以停止销售计算机并开始更新固件。这是一个昂贵的选择。

  发布多少设备并不重要。修复错误可能有问题,甚至为时已晚。火箭坠毁了——检测到错误,但为时已晚。病人死了——错误被检测到了,但它不会把人带回来。导弹防御系统有瞄准精度损失 - 检测到错误,但损害已经完成。汽车故障不起作用 - 检测到错误,但这无助于车祸受害者。编程错误的代价是可怕的,不是吗?

  结论很简单:嵌入式设备的代码应该尽可能彻底地测试。特别是如果错误可能导致人员伤亡或巨大的经济损失。

  静态代码分析是检测错误的过程,但它不能保证它会找到代码中的所有错误。但是,开发人员应利用任何机会额外检查代码的正确性。静态分析器可以指出即使在多次代码审查后仍然存在的各种错误。

  如果静态分析可以帮助减少设备代码中的错误数量,那就太棒了。也许发现这些特定错误将防止生命损失。或者也许这些公司不会浪费很多钱,也不会因为客户投诉而失去良好的声誉。

  其次,静态代码分析器大大降低了软件测试和调试过程的成本。

  静态分析允许您在编码或夜间构建期间发现错误。因此,搜索和修复大多数错误可以便宜得多。

  可能每个开发人员都尝试“刷新”设备失败。例如,在此过程中,设备未设置为适当的电压或完全烧坏。发生了什么,你在哪里寻找问题?毕竟,不仅是软件错误可能是问题的根源。这也可能是硬件本身或低质量布局中的错误。因此,查找错误的过程可能需要很长时间。

  最可悲的情况:

  开发人员 100% 确定他编写的代码正确;

  电路工程师和其他负责硬件的同事参与该项目;

  对问题的搜索缓慢而疲惫;

  开发人员再次查看代码,突然发现 - 一个错别字;

  超级低效浪费队友的精力和时间;

  这是尴尬和不愉快的。

  由于以下原因,可能会弹出此类错误。在正在进行的项目中,开发人员使用了他的旧做法,他至少需要适应项目。例如,他可以编写以下代码片段:

  uchar Arr[3];

  。..。

  for (uchar idx = 0; idx != 4; idx++)

  avg += Arr[idx];

  avg /= 3;

  此错误的背景如下。开发人员以他以前的开发为基础,代码主要是使用复制粘贴方法编写的。他没有注意,忘了在一行中用 4 替换 3。结果,他在访问数组边界之外的索引时获得了未定义的行为。这样的代码可能是阴险的。程序在调试期间可以正常工作。但是,在实际条件下,当客户端多次运行它时,它可能会崩溃。如果静态分析器发现此类错误,那就太好了。

  因此,为了避免曲折而疲惫的调试过程,在刷新设备之前检测尽可能多的缺陷位置非常重要。

  第三,静态分析的使用为没有太多经验的开发人员提供了保障。

  程序错误可以形象地分为两种类型。开发人员知道第一种类型的错误。由于疏忽,这些错误意外出现在代码中。第二种错误出现在开发人员根本不知道以这种方式编写代码的情况下。换句话说,他们可以根据需要查看此类代码,但仍然找不到错误。

  静态分析器包含有关各种代码模式的知识库。在某些情况下,这些模式会导致错误。因此,他们可以指出开发人员自己不会发现的错误。一个例子是使用 32 位 time_t 类型,这可能会导致2038 年之后设备不正确的工作。

  另一个例子是程序的未定义行为,这是由于不正确使用班次运算符 《《/》》 而发生的。这些运算符在微控制器的代码中应用非常广泛。不幸的是,开发人员经常非常粗心地使用这些运算符。这使得程序不可靠,并且依赖于编译器的特定版本和设置。同时,该程序可以工作,但这并不是因为它的代码编写正确,而是因为开发人员很幸运。

  使用静态分析器,开发人员可以对冲许多此类不愉快的情况。此外,还可以使用分析器来控制整体代码质量。当项目团队成长或变化时,这一点很重要。换句话说,分析器有助于跟踪初学者是否开始编写错误代码。

  第四,现代静态分析仪不仅可以发现代码错误和漏洞,还可以支持嵌入式系统的编码标准。这些标准提高了程序的安全性、可移植性和可靠性级别。

  C 和 C++ 被称为嵌入式系统的流行编程语言。MISRA C、MISRA C++ 和 AUTOSAR C++ 等标准是为这些语言开发的。每个标准都有相当数量的规则和建议(MISRA C:143,MISRA C++:228,AUTOSAR C++:超过350)。在没有静态代码分析器的情况下进行编码时,根本不可能遵守这么多规则和建议。这些规则是开发人员需要避免的编码模式,从而降低出错的可能性。目前,静态分析的所有主要参与者(Coverity,Klockwork,PVS-Studio等)都在努力尽可能增加标准的覆盖范围。

  编码标准

  MISRA的历史始于很久以前。早在 90 年代初,“安全 IT”英国政府计划就为与电子系统安全相关的各种项目提供资金。MISRA(汽车行业软件可靠性协会)项目本身的成立是为了创建陆地车辆(主要是汽车)微控制器软件开发指南。

  MISRA(作为一个组织)是一个由来自各个汽车和飞机行业的利益相关者组成的社区。

  宾利汽车;

  福特汽车公司;

  捷豹路虎;

  德尔福柴油系统;

  堀场米拉;

  千变万化的电气;

  伟世通工程服务;

  利兹大学;

  里卡多·英国;

  采埃孚天合。

  非常强大的市场参与者,不是吗?毫不奇怪,他们的第一个语言相关标准MISRA C在关键嵌入式系统的开发人员中得到了广泛的认可。过了一会儿,米斯拉C++出现了。标准的版本已逐步更新和修订,以涵盖语言的新特征。目前,目前的版本是MISRA C:2012和MISRA C++:2008。

  MISRA最显着的特点是其对细节的令人难以置信的关注和在确保安全和保障方面的极其细致。作者不只是在一个地方收集所有C和C++缺陷(例如,CERT的作者)。他们还仔细制定了这些语言的国际标准,并写出了所有可能犯错的方法。之后,他们添加了有关代码可读性的规则和建议。毕竟,在简单易读的代码中犯错误更难,并且在代码审查期间更容易检测到错误。

  通常,第一次遇到MISRA的人会觉得该标准的目的是“禁止这个,禁止那个”。事实上,确实如此,但只是部分。

  该标准确实有许多禁止某些操作的规则。但是,这并不意味着要全部禁止,而是列出可能以某种方式导致安全漏洞的所有可能方法。对于大多数规则,您可以自己选择是否需要遵守它们。让我更详细地解释一下。

  MISRA C 规则分为三个主要类别:强制性、必需性和建议性。在任何情况下都不能违反强制性规则。例如,此部分包含规则:“不要使用未启动变量的值”。所需的规则不太严格。它们允许偏差的可能性。但是开发人员需要以书面形式证明这些偏差的合理性,并详细记录它们。其余规则属于咨询类别——它们是非强制性的。

  MISRA C++略有不同:没有必填类别,大多数规则都属于必需类别。因此,事实上,您有权违反任何规则——只是不要忘记记录偏差。还有文档类别。它包括与一般做法相关的强制性规则(不允许有偏差),例如“汇编程序的每次使用都必须记录”或“包含的库必须符合 MISRA C++”。

  该标准既包含对问题问题的描述,也包含有关在承担某项任务之前必须了解的提示:如何根据MISRA设置开发过程;如何使用静态分析器检查代码的合规性;必须维护哪些文件,如何填写等等。

  目前,MISRA不断发展。例如,MISRA在2019年初宣布了MISRA C:2012第三版(第一版)”。MISRA C:2012版已更新并扩展了新规则。同时,即将发布的“MISRA C:2012修正案2 - C11核心”,这是2012年的修订标准。

  MISRA C++也不会停滞不前。如您所知,MISRA C++的最后一个标准可以追溯到 2008 年,因此它涵盖的语言的最新版本是 C++03。正因为如此,还有另一个类似于MISRA的标准,它的名字是AUTOSAR C++。它最初旨在作为MISRA C++的延续,旨在涵盖该语言的更高版本。与其策划者不同,AUTOSAR C++每年更新两次,目前支持 C++14。新的 C++17 和 C++20 更新尚未到来。

  结论

  在本文中,我想说明使用静态分析器对于任何嵌入式项目都非常有用。使用静态分析将帮助您:

  减少查找和修复错误所需的时间;

  减少出现严重错误的可能性;

  减少对固件更新的需求;

  监控整体代码质量;

  监控新团队成员的表现;

  严格遵守一定的软件开发标准;

  监控第三方模块/库的代码质量。

  审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分