0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

星星科技指导员 来源:嵌入式计算设计 作者:Maxim Stefanov 2022-06-21 10:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

静态代码分析器就是这些工具之一。本文描述了静态分析以及它如何在嵌入式系统中受益。

静态代码分析

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

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

静态分析工具的工作原理

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

分析器将源代码转换为特殊模型以供进一步分析(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 在关键嵌入式系统的开发人员中获得了广泛的认可。不久之后,出现了 MISRA C++。逐渐地,标准的版本已经更新和修订,以涵盖语言的新功能。目前,当前版本是 MISRA C: 2012 和 MISRA C++: 2008。

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

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

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

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

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

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

目前,MISRA 不断发展。例如,MISRA 在 2019 年初发布了《MISRA C:2012 第三版(第一次修订)》。这是 MISRA C:2012 版更新和扩展了新规则。同时,即将发布的《MISRA C: 2012 Amendment 2 – C11 Core”公布,这是 2012 年的修订标准。

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

结论

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

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

减少严重错误的可能性;

减少对固件更新的需求;

监控整体代码质量;

监控新团队成员的表现;

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

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

审核编辑:郭婷

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

    关注

    5186

    文章

    20155

    浏览量

    328966
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76714
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73154
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用xmake+zig更优雅的进行嵌入式系统开发

    引言在嵌入式系统开发领域,构建工具的稳定性与可维护性对项目长期发展至关重要。嵌入式项目通常需要针对不同硬件平台进行交叉编译,每个平台都需要依赖特定的构建工具链,环境搭建复杂。随着LLVM工具链的普及
    的头像 发表于 11-30 10:04 3466次阅读
    使用xmake+zig更优雅的进行<b class='flag-5'>嵌入式</b><b class='flag-5'>系统开发</b>

    C语言在嵌入式开发的应用

    C 语言在汽车电子控制系统开发的主导地位。 2、设备驱动程序 设备驱动程序是嵌入式系统连接硬件和软件的桥梁,它负责实现
    发表于 11-21 08:09

    是德示波器MSOX3052T在嵌入式系统的应用

    混合信号示波器,凭借其创新的硬件架构与智能分析功能,为嵌入式系统调试提供了全新的解决方案。本文将从技术特性、应用场景及实战案例三个维度,深入探讨该示波器在嵌入式
    的头像 发表于 08-27 17:38 499次阅读
    是德示波器MSOX3052T在<b class='flag-5'>嵌入式</b><b class='flag-5'>系统</b><b class='flag-5'>中</b>的应用

    如何在嵌入式RF测试实施多域信号分析

    射频(RF)测试是嵌入式系统开发与验证的关键环节,尤其是在电信、航空航天、汽车以及物联网等行业。随着嵌入式系统的日益复杂,传统RF测试方法
    的头像 发表于 08-15 16:32 2630次阅读
    如何在<b class='flag-5'>嵌入式</b>RF测试<b class='flag-5'>中</b>实施多域信号<b class='flag-5'>分析</b>

    AMD 2025.1版嵌入式软件和工具的新增功能

    AMD 2025.1 版嵌入式软件和工具是面向新一代嵌入式系统开发而打造的综合平台,全面加速概念构想到部署落地。
    的头像 发表于 08-15 15:32 1040次阅读

    入行嵌入式应该怎么准备?

    知识: 一、C/C++编程C/C++是嵌入式系统开发中最常用的编程语言。熟练掌握C/C++语言将使你能够理解和编写底层驱动程序、操作系统以及与硬件交互的代码。对于嵌入式
    发表于 08-06 10:34

    明远智睿SSD2351:开启嵌入式系统开发新时代

    在当今科技飞速发展的时代,嵌入式系统已经广泛应用于各个领域,从智能家居到工业自动化,从智能交通到医疗设备,嵌入式系统无处不在。而开发板作为
    的头像 发表于 07-15 15:47 407次阅读

    明远智睿SSD2351:嵌入式系统开发的卓越之选

    以独特的魅力开启嵌入式系统开发的新篇章。 性能卓越,计算能力出众 明远智睿SSD2351搭载了四核1.4GHz处理器,这一配置在同类开发脱颖而出。四核架构的设计是其性能卓越的关键所
    的头像 发表于 07-15 15:46 452次阅读

    Linux嵌入式和单片机嵌入式的区别?

    区别 单片机嵌入式系统和Linux嵌入式系统是两种不同的嵌入式系统开发方式,它们在应用领域、
    发表于 06-20 09:46

    泰克MSO2024B混合信号示波器在嵌入式系统开发的应用

    随着嵌入式系统设计的复杂度不断提升,工程师在调试和验证过程面临着越来越多的挑战。混合信号示波器(MSO)作为集成了模拟信号与数字信号分析功能的测试工具,为
    的头像 发表于 06-16 15:40 581次阅读
    泰克MSO2024B混合信号示波器在<b class='flag-5'>嵌入式</b><b class='flag-5'>系统开发</b><b class='flag-5'>中</b>的应用

    STM32开发入门进阶必备!《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》新书发布!

    上市。高校教学推荐,STM32入门必读!图书介绍《STM32嵌入式系统开发——基于STM32CubeMX和HAL库》是一本介绍嵌入式系统S
    的头像 发表于 04-03 14:54 1367次阅读
    STM32<b class='flag-5'>开发</b>入门进阶必备!《STM32<b class='flag-5'>嵌入式</b><b class='flag-5'>系统开发</b>—基于STM32CubeMX和HAL库》新书发布!

    Python在嵌入式系统的应用场景

    你想把你的职业生涯提升到一个新的水平?Python在嵌入式系统中正在成为一股不可缺少的新力量。尽管传统上嵌入式开发更多地依赖于C和C++语言,Python的优势在于其简洁的语法、丰富的库和快速的
    的头像 发表于 03-19 14:10 1200次阅读

    嵌入式系统开发圣经【干货】

    内容包括:嵌入式系统的介绍、嵌入式SoC硬件系统概论、嵌入式系统软件开发。适用于产品主管、
    发表于 03-12 13:58

    IAR分析嵌入式系统的市场前景

    作为全球领先的嵌入式系统开发软件解决方案供应商,IAR始终致力于为客户提供高性能与高安全性的开发工具,支持不同行业的嵌入式产品开发
    的头像 发表于 02-26 15:34 903次阅读

    嵌入式系统的代码优化与压缩技术

    在当今数字化时代,嵌入式系统广泛应用于各个领域,从智能家居设备到工业控制系统,从汽车电子到可穿戴设备,它们无处不在。而在嵌入式系统开发
    发表于 02-26 15:00