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

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

3天内不再提示

安全编码技术:提高嵌入式应用代码安全性与可靠性

互联网资讯 来源:IAR 作者:IAR 2024-08-27 15:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:IAR

编程语言的现代化和更好的编码技术与从机械计算机到现代软件开发流程的演变直接相关。我们已经从高度专业化、主要是数学符号的表示法过渡到了更接近人类语法的高级编程语言,这一进步归功于编译器技术。然而,这也打开了代码缺陷之门。 C和C++ 等高级编程语言,包含大量未定义的行为,而不同的编译器对这些行为的解释可能略有不同,这可能会导致未知或不希望出现的副作用,最终转化为缺陷。

查找和修复这些缺陷可能会占用高达80%的开发时间,具体取决于开发机构的成熟程度。这引出了一个明显的结论:代码质量是一个大问题。那么,为什么不尽量避免缺陷,以减少调试所需的时间呢?

顺便说一句,我们现在仍然在软件中使用“错误”和“调试”这些概念,但这些词的起源可以追溯到哈佛大学的机械计算机。当时,一只飞蛾卡在继电器中,这一事件被记录为计算机历史上第一个“错误”或缺陷。

一次又一次重复同样的错误

众所周知,在Web、应用程序、桌面,甚至嵌入式开发中,开发人员往往会无意间一次又一次地在他们的源代码中引入相同类型的错误。这个结论来自于多个重要机构,如NASA、贝尔实验室和MITRE,他们进行了多项调查和研究。常见缺陷的例子包括在C++代码(甚至C代码)中没有进行分配后的释放,以及使用没有原型的函数,因此无法在编译时进行严格的类型检查。这项研究的结果列出了最佳编程实践或推荐的编程实践,它们可以识别有风险的和不良的编码行为。

有许多关于如何提高代码质量的指南和编码实践,它们都基于常见的错误,并指出了如何在将来避免这些常见错误。其中一些技巧和实践已经成为被广泛接受的标准(比如MISRA-C和CERT-C),特别是在汽车、医疗和铁路等关键行业中,以确保应用程序的代码安全性(code safety)和代码防护能力(code security)。诸如IEC 61508、EN 50128和ISO 26262等功能安全标准建议[或强烈建议,具体取决于安全完整性等级(SIL)或汽车安全完整性等级(ASIL)]使用静态和运行时分析工具,以满足标准。因为安全关键系统中的缺陷可能会导致严重后果,如人员伤亡或环境破坏。

关注可靠性

安全编码技术要综合考虑代码质量、代码安全性和代码防护能力。代码安全性关注的是软件的可靠性,而代码防护能力则旨在防止不必要的活动,并且在遭受攻击时确保系统安全。这两者都高度依赖于代码质量,因为代码质量是每个可靠应用程序的基础。

安全编码技术和标准的目标是推动软件的安全性,以确保所需的可靠性。然而,同样重要的是提高源代码的可读性和可维护性。更高效、更易读的代码意味着源代码更加健壮、缺陷更少且在未来可用,有助于提高代码的可重用性。

MISRA C是最成熟的软件开发标准之一,可以避免常见的缺陷和漏洞。当然,还有一些其他指南,如CWE和CERT-C编码标准,这些标准对于任何嵌入式应用程序都是强烈推荐的。下面让我们更深入地了解这些编码标准。

MISRA C标准

MISRA C由汽车行业软件可靠性协会(Motor Industry Software Reliability Association)开发,它的目标是提高嵌入式系统中代码的安全性、可移植性和可靠性,尤其是那些使用ISO C编程的系统。

MISRA C标准的第一版名为《车载软件C语言开发指南》,于1998年发布,正式名称为MISRA-C:1998。之后于2004年和2012年进行了更新,添加了更多的规则。另外,还有基于C++ 2003的MISRA C++ 2008标准。此后,MISRA C: 2012的修正案1又添加了14条附加规则,重点关注ISO C安全指南(Secure Guidelines)中强调的安全问题(security concerns)。其中一些规则解决了在许多嵌入式应用程序中已知的安全漏洞之一:与使用不可信数据相关的特定问题。

MISRA规则可以帮助您在提交代码进行正式构建之前发现问题,因此通过这种方式发现的缺陷就好像缺陷从未存在过一样。MISRA规则的设计是以安全性和可靠性为前提的,同时也让代码更容易移植到其他工具和架构上。

CWE and CERT C/C++

CWE,即通用缺陷列表(Common Weakness Enumeration),是一个由社区开发的有关软件缺陷的词典。CWE提供了一套统一的、可衡量的软件缺陷,以便更好地理解和管理它们,并且可以支持能够发现它们的高效软件安全工具和服务。

CERT C/C++安全编码标准(Secure Coding Standards)是由计算机紧急响应小组(Computer Emergency Response Team,CERT)发布的标准,提供了有关C/C++编程语言中安全编码(secure coding)的规则和建议。

实施安全编码技术

作为通常性的建议,每个嵌入式应用程序至少都应遵循MISRA(对于安全关键系统,MISRA 是强制性的)、CWE和CERT C/C++标准。

遵循这些编码标准之后,在运行时,您的应用程序仍然可能会受到算术问题、缓冲区溢出、边界问题、堆完整性和内存泄漏等问题的影响。要检测到这些错误,可以在可能发生潜在错误的所有位置插入特定的检测代码或断言。然而,手动添加指令来检查并在运行时报告问题是一项非常耗时的任务。

要遵守所有这些指南和标准,您需要遵循近700条规则和要求,同时还需要在源代码中添加检测代码。那么,如何实施安全编码技术并遵循所有这些规则呢?

使用自动化工具

提高软件质量、安全性和可靠性的最佳方法是使用自动化工具。这可以通过使用高质量的编译器和链接器(最好是经过功能安全认证的编译器和链接器),以及自动化的静态分析和运行时分析工具来实现。

IAR作为全球领先的嵌入式系统开发软件解决方案供应商,所提供的集成开发环境IAR Embedded Workbench就包括了编译器、汇编器、链接器和调试器,并无缝集成了静态分析工具 C-STAT和运行时分析工具C-RUN,形成了完整的工具链。凭借这些强大的功能,IAR Embedded Workbench可以确保代码的稳健性、安全性和高质量。

我们先来看看编译器和链接器,它们应该支持现代编程语言,比如最新的C(ISO/IEC 9899:2018)和C++(ISO/IEC 14882:2020,也称为C++20修订版),这样它们就会在出现可疑情况或语法问题时生成警告,例如,易失性内存访问,其求值顺序可能会影响应用程序的逻辑。

编译器和链接器警告(warnings)是您的第一步静态分析检查,绝不能忽视,特别是在功能安全环境中。最佳建议是通过更改编译器设置将所有警告视为错误,这样就可以将这些警告转换为错误。这将让开发人员修复代码中的所有不明确之处,因为所有问题都将被视为真正的问题。

静态分析工具可以帮助您发现代码中最常见的缺陷,同时还可以帮助您找出开发人员在尝试编写代码时通常不会考虑或担心的问题,尤其是当他们只是编写脚手架代码以使某些功能正常运行时。这种类型的工具确实可以帮助您开发更高质量的代码,因为它们可以帮助您实施编码标准。IAR的C-STAT静态分析工具无需任何安装和静态代码分析工程创建,只需要进行简单的规则设置,就可以在构建(Build)成功之后进行静态代码分析,非常适合开发人员在日常开发过程中使用。

此外,还有动态或运行时分析工具,可以捕获仅在运行时出现的代码缺陷。动态或运行时分析工具可以在于软件调试器中执行程序时发现代码中的实际和潜在错误。IAR的C-RUN动态分析工具通过简单的配置、重新编译、运行,即可实现算术检查、边界检查和堆检查。使用C-RUN无需对现有流程做任何修改,可作为日常开发工作流程的自然组成部分,这极大地降低了动态分析工具的使用门槛。

当您查看系统中可能存在的所有缺陷时,静态分析工具擅长找到某些类型的缺陷,而运行时分析工具则擅长找到其他类型的缺陷。有时它们可能会有重叠,但有时只有一种工具才能检测到某个缺陷。要获得最全面的代码分析,最好将这两种工具结合使用,并将它们与顶尖的构建工具集成在一起。下图的矩阵很好地展示了在结合不同工具进行检测时完整的缺陷覆盖范围。

wKgZombNeZ6AM0yGAACd3-S0bYI342.png

总结

随着嵌入式系统的复杂性提高,对于嵌入式软件的要求也越来越高,其中最核心最根本的是代码质量,而遵循编码标准的安全编码技术是提高代码质量的最佳实践。实施安全编码技术最有效的方式是应用自动化工具,包括编译器、链接器、静态分析工具、运行时分析工具。这样可以高效地在开发过程中提高代码质量及其安全性和可靠性,既减少了项目的开发时间和成本,又提高了产品的质量和竞争力。

审核编辑 黄宇

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

    关注

    5209

    文章

    20679

    浏览量

    337234
  • IAR
    IAR
    +关注

    关注

    5

    文章

    415

    浏览量

    38684
  • 编码
    +关注

    关注

    6

    文章

    1041

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度剖析MAX32590:打造安全可靠嵌入式设备

    深度剖析MAX32590:打造安全可靠嵌入式设备 在当今数字化时代,嵌入式设备的安全性和性能成为了电子工程师们关注的焦点。MAX32590作为一款具备高度
    的头像 发表于 03-26 16:50 285次阅读

    嵌入式AI开发必看:杜绝幻觉,才是工业级IDE的核心底气

    中难以被发现,一旦上线将直接导致设备停机、产线瘫痪,甚至引发安全事故。 ▌传统IDE校验能力缺失:当前主流嵌入式IDE缺乏针对工业场景的专业校验逻辑,无法验证AI代码在实时
    发表于 03-18 13:49

    知识分享-嵌入式系统可靠性模型

    嵌入式系统可靠性设计技术及案例解析1.3嵌入式系统可靠性模型嵌入式系统
    的头像 发表于 03-11 16:43 405次阅读
    知识分享-<b class='flag-5'>嵌入式</b>系统<b class='flag-5'>可靠性</b>模型

    半导体嵌入式单元测试的核心技术、工具选型与落地全流程

    要求不断提高的背景下,单元测试已经成为确保软件质量和可靠性的不可或缺的环节。winAMS作为一款专业的半导体嵌入式软件单元测试工具,通过目标代码级测试、硬件行为仿真、智能化测试用例生成
    发表于 03-06 14:55

    什么是高可靠性

    越来越高。 高可靠性PCB可以发挥稳健的载体作用,实现PCBA的长期、稳定运作,从而保证终端产品的安全性、稳定性和使用寿命,企业进而得以增强竞争力、提升信誉、扩大市场份额、提高经济效益。 三
    发表于 01-29 14:49

    什么是嵌入式应用开发?

    系统中,用于控制、监测或通信等特定用途。与一般计算机系统不同,嵌入式系统通常具有较小的存储容量、处理能力和功耗,且需要满足特定的实时可靠性安全性要求‌。 应用领域
    发表于 01-12 16:13

    嵌入式软件测试找bug的常见方法和秘诀

    可靠性的要求比较高。嵌入式系统安全性的失效可能会导致灾难的后果,即使是非安全性系统,由于大批量生产也会导致严重的经济损失。这就要求对
    发表于 01-12 07:07

    车规级与消费级芯片的可靠性安全性与成本差异

    引言在汽车电子和消费电子领域,"车规级"与"消费级"芯片代表了两种截然不同的设计理念和技术标准。车规级芯片专为汽车应用设计,强调在极端环境下的可靠性安全性
    的头像 发表于 11-18 17:27 1609次阅读
    车规级与消费级芯片的<b class='flag-5'>可靠性</b>、<b class='flag-5'>安全性</b>与成本差异

    嵌入式开发的关键点介绍

    开发需要考虑嵌入式系统的资源限制,例如:内存、CPU处理能力等等。因此,嵌入式开发需要开发人员具备优化代码的能力。嵌入式系统的安全性非常重要
    发表于 11-13 08:12

    嵌入式软件测试与专业测试工具的必要深度解析

    ‌:工具的易用和学习曲线是否符合团队技术水平。 ‌合规要求‌:工具是否支持生成符合行业标准(如ISO 26262)的测试报告和审计追踪。 嵌入式软件测试不再是可选项,而是确保系统可靠性
    发表于 09-28 17:42

    有哪些技术可以提高边缘计算设备的安全性

    边缘计算设备的安全性面临分布部署、资源受限(算力 / 存储 / 带宽)、网络环境复杂(多无线连接)、物理接触易被篡改等独特挑战,因此其安全技术需在 “
    的头像 发表于 09-05 15:44 1825次阅读
    有哪些<b class='flag-5'>技术</b>可以<b class='flag-5'>提高</b>边缘计算设备的<b class='flag-5'>安全性</b>?

    请问DM平台访问安全性如何控制?

    DM平台访问安全性如何控制?
    发表于 08-06 06:01

    【干货速递】嵌入式数据可靠性,软件设计的这些细节不能忽视!

    问题。软件设计软件设计在嵌入式数据存储可靠性中扮演着至关重要的角色。它不仅包括系统驱动的开发,还涉及应用层面的优化。一个精心设计的软件系统可以显著提高数据的完整和系统的稳
    的头像 发表于 07-31 11:34 684次阅读
    【干货速递】<b class='flag-5'>嵌入式</b>数据<b class='flag-5'>可靠性</b>,软件设计的这些细节不能忽视!

    【深度解析】硬件电路设计:如何确保嵌入式数据可靠性

    嵌入式系统开发中,硬件电路设计是确保数据可靠性的关键环节。本期我们将重点探讨硬件设计中的两个重要方面:数据读写保护和掉电保护。硬件电路设计在嵌入式系统开发中,硬件电路设计对于确保数据的可靠性
    的头像 发表于 07-30 11:35 886次阅读
    【深度解析】硬件电路设计:如何确保<b class='flag-5'>嵌入式</b>数据<b class='flag-5'>可靠性</b>?

    技术指南】提升嵌入式数据可靠性,从元器件选型开始!

    数据可靠性嵌入式产品开发中的关键问题,涉及多个层面的设计和选型。从本期开始,我们将通过一系列内容深入探讨嵌入式数据存储的可靠性问题。前言数据可靠性
    的头像 发表于 07-29 11:35 610次阅读
    【<b class='flag-5'>技术</b>指南】提升<b class='flag-5'>嵌入式</b>数据<b class='flag-5'>可靠性</b>,从元器件选型开始!