tag 标签: 代码质量

相关帖子
相关博文
  • 热度 3
    2024-8-16 14:12
    265 次阅读|
    0 个评论
    技术发展比以往任何时候都要迅速,每天我们都能见到新产品和功能,它们可以完成各种难以想象的任务。这不仅仅是因为移动应用和计算机;而是因为嵌入式系统和物联网(IoT)设备,它们在我们的日常生活和工业自动化等行业中迅速变得司空见惯。 这些设备几乎靠软件运行着一切:婴儿监视器、扬声器、健身追踪器、安全摄像头、恒温器和车辆等。 关于这个新世界,建筑师、MIT教授和作家Nicholas Negroponte说:“像空气和饮用水一样,我们只有在数字化缺席时才会注意到它,而不是它存在的时候。”按照内格罗蓬特的观点,我们已经让数字技术包围了我们,我们甚至在它缺席或造成功能安全或信息安全问题时才会注意到它。 我们所知道的物联网设备——包括嵌入式系统——具有通过互联网连接的处理器、传感器和其他特性。而当我们谈论嵌入式系统时,我们指的是在更大的数字、机械或电力系统中具有特定功能的处理器。嵌入式系统可以是物联网设备中的固件,或者是汽车、机器人、信用卡读卡器、手机、小工具、网络设备、医疗设备或几乎所有东西的电子控制单元(ECU)。 对于组织来说,工业4.0正在改变产品的制造和分销。随着嵌入式系统中增加更多组件以促进生产力和创新,物联网信息安全和工业4.0网络安全的挑战日益增加。再加上云计算与分析、机器学习和人工智能等技术,工业4.0突然成为一个更加复杂的环境——不仅跨越多设备和系统,还跨越多位置和贡献者。 管理维护物联网和嵌入式系统的信息安全(和功能安全)不能是一个孤立的过程。相反,组织和开发团队应该专注于保护物联网所依赖的软件,因为软件负责每个设备的性能,并促进设备和系统之间的通信。 C和C++对嵌入式系统软件安全的重要性 由于规模和成本限制,嵌入式系统中的软件使用有限的计算机资源进行处理、内存和供给。由于对轻量级软件的需求,像C和C++这样的编程语言在嵌入式系统中占据主导地位,就像它们目前在云中运行大多数服务器的Linux内核一样。虽然C++比C需要更多的计算资源,但更强大的微处理器可用性使C++成为全球数百万嵌入式系统的优选语言。 其他编程语言如Python也用于嵌入式系统,但C和C++是首选的主要语言。还有嵌入式C++(EC++),它是C++语言的一个子集,允许在具有完整C++语言主要功能的同时实现更大的空间和速度效率。当今的微处理器可以内置C++编译器,这让嵌入式系统编码变得更容易。 为嵌入式系统编码与任何其他类型的应用程序都不同。首先,你有资源限制,然后你必须为容错性、实时功能、可靠性设计,而且大部分时间没有停机时间。但更重要的是,代码必须是功能安全和信息安全的。想想嵌入式系统和物联网设备在医疗保健和制药行业,或汽车和航空行业的重要性。不仅这种技术的缺陷会很显眼,如果它们不功能安全信息不安全将成为一个关键问题。 静态分析对嵌入式系统和物联网软件安全的重要性 软件安全漏洞通常在开发过程中产生,因此在编码过程的早期发现它们可以预防未来的信息安全问题。确保源代码没有可能导致漏洞和缺陷的最重要的工具之一是静态分析。也称为静态应用程序安全测试或SAST,静态分析扫描应用程序的源代码,包括嵌入式系统和物联网的源代码,用于工业4.0网络安全应用程序。高度专业化的代码扫描根据使用的相应编程语言和框架查找特定缺陷。静态分析工具——如Perforce Helix QAC和Klocwork——报告符合编码标准的合规性。 静态分析工具使开发和安全团队能够分析数千至上百万行代码。它们寻找代码中的缺陷,并根据规则和政策执行编码标准。最重要的是,它们已经成为软件开发生命周期中不可或缺的一部分,并且是必须每次代码更改或在发布新版本之前定期在源代码上运行的步骤。 随着组织对嵌入式系统和物联网使用的增加,信息安全和功能安全的重要性也在增加,特别是在跨行业的任务关键功能方面。通过静态分析发现的功能安全性和信息安全性缺陷可以防止有缺陷设备的大规模生产,并节省资金和公司的声誉。 嵌入式设备中的安全性是关于减少漏洞数量。严重程度级别不同,高度严重的漏洞代表着更高风险的关键开发。在所有软件中,无论其部署在哪里,都有几种常见的漏洞类型。例如,远程代码执行和跨站脚本漏洞。在嵌入式系统和物联网设备中,大部分漏洞与内存缓冲区溢出、资源泄漏、不当的访问控制、加密问题和代码注入有关。这些是通过静态分析扫描在嵌入式系统中发现的一些最常见的嵌入式安全漏洞。 编码标准对嵌入式系统和工业4.0安全的重要性 正如前面提到的,C和C++在嵌入式系统中占主导地位。多年来,实施工业4.0和物联网的组织已经认识到所有代码中的信息安全性的重要性,特别是对于嵌入式设备中的C和C++,其中损失的成本可能不仅仅是财务方面。建立并不断改进编码标准就是为了帮助提高软件的安全性、可移植性、可靠性和可维护性的水平。静态分析除了在源代码中搜索缺陷和漏洞外,还可以应用于编码标准中规定的规则和建议。这对于需要验证符合行业标准的组织特别有用。嵌入式系统的常见编码标准示例包括MISRA、AUTOSAR和CERT。 行业标准也在解决工业4.0网络安全方面发挥作用:例如,IEC 62443针对自动化和控制系统中技术的开发和运行网络安全要求。该标准定义了一个安全软件开发生命周期,包括设计、实施、认证、验证、缺陷管理以及产品生命周期结束。 安全标准如ISO 27001,是一个信息安全标准,有助于确保制造厂内使用的设备是安全的,通常需要使用编码标准来支持合规性。即使在合规性之外,如上述IEC 62443所要求的,在软件开发期间使用编码指南也被认为是一种良好做法。 为嵌入式系统编码,遵循编码标准并将静态分析作为软件开发生命周期的一部分,将使我们的数字世界更加安全。 如果您想亲身体验为什么成千上万的开发者依赖Perforce静态分析工具,今天就注册免费试用。 ➡️ 注册您的免费试用marketing@polelonk.com
  • 热度 2
    2024-8-14 10:17
    273 次阅读|
    0 个评论
    质量闸门正如其名:它们通过在软件开发生命周期(SDLC)的各个阶段作为质量里程碑(或“闸门”),确保软件的高质量交付,防止不良代码通过。在这里,我们解释了什么是质量闸门,它们如何工作,以及如何使用静态分析来实现它们。 质量闸门是什么? 质量闸门是在 IT 或开发项目中实施的检查点,要求在进入下一个开发阶段之前达到最低阈值。质量闸门阻止了不符合标准的代码部署,有助于确保更高质量的产品。 有了质量闸门,您可以根据您为代码设置的指标和条件强制执行质量和其他评级。这是识别瓶颈和问题区域的好方法,这样您就不会在后期遇到它们。 质量闸门在 DevOps 中用于衡量开发或质量保证过程中的质量,并识别防止后期延误和返工的漏洞。它们是在重要关头实施的项目管理措施,以便团队可以有信心地向前迈进,了解他们的代码已经满足了该阶段所需的质量标准。 为什么质量闸门在 DevOps 流水线中很重要? 质量闸门有助于确保软件的稳定性和可靠性。质量闸门的迭代性质有助于质量保证工程师和开发人员跟踪错误并尽快解决问题,从而提高质量和投资回报率。由于团队设置了通过闸门的条件,质量闸门可以根据项目的需求随时定制。 将质量闸门构建到您的开发流水线中有许多好处: 提高整体质量和维护安全 :策略性地放置的质量闸门作为 SDLC 中质量的基准,并通过对代码的早期和频繁指出弱点来维护安全。它们可以作为左移方法的一部分,在 SDLC 的早期检测问题,并且可以有效地高效地集成到 CI/CD 流水线中。 节省代码审查时间 :质量闸门可以作为清单,跟踪您迄今为止实现的要求,其他开发人员在评估代码时可以快速审查。 优化软件性能 :理想情况下,代码是简洁、可维护和可复用的。质量闸门提供了帮助分析代码性能并移除冗余或拖累系统的代码的测量方法。您可以为质量闸门设置软件指标,例如圈复杂度。 持续监控代码库 :质量闸门持续监控源代码的质量,提供组织设定的关键指标的一致反馈。 合规性验证 :质量闸门可以设置,以确保和验证代码符合既定的编码、安全和安全标准。 质量闸门如何工作 作为持续集成的一部分,流水线质量闸门确保项目满足预定义的标准,这意味着它可以进入开发的下一个阶段。代码在满足要求前会进入一个暂存库。 质量闸门的状态有: 通过:满足要求,可以继续生产。 警告:要求可能接近满足,或者勉强通过,因此在允许代码进入下一个阶段之前应该进行验证。 失败:未满足要求。在生产可以继续之前,应该解决标记的问题。 质量闸门的最佳实践是在开发的每个关键阶段实施它们: 计划 编码 构建 测试 版本发布 部署 关键是限制它们到这些主要阶段,因为您添加的闸门越多,测试就越复杂,这可能导致昂贵成本的延误。在 CI/CD 流水线中策略性地设置质量闸门也意味着您不必按顺序设置它们,而是可以拥有多个并行流水线和并行测试或重叠测试。 使用 Klocwork 和 Helix QAC 作为质量闸门 无论您是执行增量分析、差异分析还是集成分析,静态分析/SAST 工具都旨在优化 DevOps 和 DevSecOps 流程,并且可以作为检查代码质量和安全问题的一种质量闸门类型 —— 而不会放慢开发速度。 一些静态分析工具 —— 像 Klocwork 和 Helix QAC —— 可以在新代码进入时执行合并请求分析。质量闸门防止您的提交合并到受保护的分支,直到满足设定条件。例如,您可以使用 Klocwork 作为 GitLab 或类似 CI 环境中的质量闸门。 虽然实施质量闸门需要一些初步规划,但它可以帮助简化您的 DevOps 流程。使用正确的工具构建质量闸门可以加速您的流水线,并确保您的代码质量最高。 免费试用Klocwork/Helix QAC ⏩marketing@polelink.com
  • 热度 1
    2024-6-26 09:57
    535 次阅读|
    0 个评论
    Helix QAC 2024.1改进了对C++20和C23语言特性的支持,并增加了分析使用多个编译器的项目的新功能。此外,Validate增强了对于搜索功能和角色权限的用户体验,并且包括一个新的问题列表的CSV下载选项。 此版本还包括对于C/C++的CWE、C的HKMC和MISRA C++:2023®合规模块的扩展执行,以及许多常规产品质量提升。 语言增强 C++20 此版本增加了对以下语言功能的改进支持: • C++20的概念 • C++20简化函数模板 C23 此版本增加了对以下语言特性的初始支持: • 当设置 -c23constexpr 时支持应用C23 constexpr 除了扩展的语言功能支持外,对于GCC 12/13版本以及MSVC 2022版本的用户体验也得到了改进。 多编译器项目支持 Helix QAC现在能够为使用多个编译器的项目提供配置分析设置。 • 支持一个项目中每种语言可以使用多个CCT。 • 提供一致的分析结果,降低在各种编译器环境中出现误报或漏报的可能性。 • 允许需要静态分析的跨平台开发项目具有更大的灵活性。 • 帮助识别编译器特定问题。 • 允许开发人员在为项目选择编译器时拥有更大的工具链的灵活性。 Validate新的提升和功能 以CSV格式下载问题列表 新的CSV下载按钮位于Validate的Issues页面顶部,根据当前的搜索查询下载缺陷列表。如需额外的问题信息,例如行号、评论和理由,需要订阅Validate高级合规报告包。 扩展搜索 Validate模块的正则表达式(RegEx)搜索功能提供了对*和**通配符字符的支持,以便在指定文件系统路径时使用。有关更多信息,请参阅modules 文档。 新角色权限 添加了“变更问题所有者(change issue owner )”权限,该权限允许用户更改问题的所有者,而无需更改问题状态。 出于审查目的保留许可证日志 现在,您可以将日志保留在许可证服务器的license.report.log文件中,以便达到审查的目的。这样,在服务器重启后,不会覆盖该文件。要了解append.license.logging的设置,请参阅validate service.。 编码标准的覆盖范围(CWE、HKMC、MISRA C++:2023®) 对于以下合规模块,改进了规则和指令的执行: 与NIST 500-268要求相关的C/C++的CWE模块 • CWE-259、CWE-412、CWE-367、CWE-99、CWE-321 C的HKMC模块 • C-MSC-011 MISRA C++:2023模块 • Dir 0.3.2 产品质量的提升 改进了对CCT自动生成的额外编译器的支持 • Keil armcc • 改进了对Clang 12的支持 • GCC 12/13 • MSVC 2022 • ‘qainject’现在是默认的同步方法 表现 • 对于涉及大量分支的结构,分析时间总体上有所减少。 libc++ 增强了对libc++标准库的支持。 • 增加了-iso646keywords的选项,以匹配-fno-operator-names行为。 • 启用时,不使用操作符的替代关键字名称。 编译器扩展 • C语言的"复合字面量"特性现在作为QAC++的扩展得到支持。 符号引用 • 改进了对VCS和非VCS创建的符号链接的支持。 Visual Studio和Eclipse IDE插件 • 总体稳定性提高 CLI • “qacli project”的新命令支持: • 创建、修改、升级、配置文件 操作系统 • 支持Ubuntu Linux 22.04 Helix QAC 2024.1的重要变化 QACLI Admin命令被弃用 对于“qacli admin”,以下命令已被弃用,并将在未来版本中删除: • --qaf-project-config, --upgrade, --create-config-file, --edit-config-file, --list-config-files 合规模块目录更改 提醒:自Helix QAC 2023.4起,Helix QAC不再从旧的“PRQA”目录中读取合规模块。合规性模块只能从“Perforce”文件目录中读取。 以下是现已过时的文件目录: • %LOCALAPPDATA%\PRQA\installed_components.ini • %PROGRAMDATA%\PRQA\installed_components.ini • ${HOME}/.config/PRQA/installed_components.ini • /etc/prqa.d/installed_components.ini 许可证管理的变更 随着Helix QAC 2024.1版本的发布,为RLM v15.1服务器提供了一个新的安装程序。如果使用Validate 2024.1与Helix QAC搭配,则此服务器版本是必需的;否则是可选的。 免费新版试用欢迎私信北汇获取
  • 热度 5
    2024-5-30 11:12
    431 次阅读|
    1 个评论
    软件开发者们有很多让他们焦虑的事情。他们最担心的不再是如何用他们最喜欢的编程语言(C、C++、Erlang、Java等)表达最新的算法。相反,这种担忧正逐渐被人工智能(AI)所取代。 在这里,我们将探讨AI编写代码的过程,并回答这个问题:AI会取代程序员吗? 什么是AI代码生成? 近年来由于生成式AI使用的激增,在很大程度上是因为现在有足够的计算能力来运行深度学习算法,以及用于训练机器学习模型所需的大量数据的增加。 AI代码的生成是使用生成式人工智能和机器学习编写计算机代码的过程。 生成式AI编码工具正在改变软件开发的过程。但这样的进步带来了不确定性。随着AI编写代码,这对软件开发者意味着什么呢? AI编写代码的未来 生成式AI的潜力已经在逐渐成形。AI正在改变行业,并准备加速创新。OpenAI进行的一项研究估计,生成式AI工具可能占据影响所有任务的47%,大大加快软件开发过程。 在Evans Data Corp进行的一项调查中,550名软件开发者被问及他们职业生涯中最令人担忧的问题。29%的人表示“我和我的开发成果已被人工智能取代”。 美国能源部橡树岭国家实验室的一个研究小组同意这一点。到2040年,机器学习和自然语言处理技术将先进到能够编写比最佳人类开发人员更好的软件代码,而且它们会做得更快。 牛津大学的研究“就业未来”警告说,随着机器学习的进步,软件工程师可能会变得计算机化,而软件设计选择将由算法优化。 软件开发,特别是在安全关键行业中,需要确保高代码质量,以满足功能要求。 所以,如果AI正在开发代码,那么代码应该是无错误和问题的。这也包括AI在软件测试中,因为它应该能够以人类不太可能配备的可靠性去检测出编码错误。 如果您确实有AI编写代码,请确保通过使用静态代码分析器来验证它是安全、安全和可靠的。 AI编写代码是否可能? AI可以编写代码。 早在2015年,Andrej Karpathy就运行了一个使用循环神经网络生成代码的项目。他用GitHub的Linux存储库(所有源文件和头文件),将它们合并成一个巨大的文档(超过400MB的C代码),并用这个代码训练了RNN。 这是它产生的: AI生成的代码——包括函数和函数声明——一夜之间。它有参数、变量、循环和正确的缩进。括号被打开,后来又被关闭。它甚至有注释。 然而,AI产生的代码有语法错误。它没有跟踪变量名,有时变量被声明但从未使用,其他时候变量被使用但没有定义。代码示例中的第二个函数比较了tty == tty。 该项目可在GitHub上获取。它使用Torch7深度学习库。这是Karpathy练习产生的整个输出文件。 生成式AI会取代软件工程师吗? AI不会取代程序员,但AI已经在帮助开发人员编写代码。像ChatGPT、Github、CoPilot和OpenAI Codex这样的AI驱动编码助手是可访问的工具,它们帮助嵌入式开发人员更快地编写更好的代码。AI代码生成器现在可以快速生成高质量的代码片段,识别问题和缺陷,并建议对代码片段进行改进。 当然,AI能够创建实际的、可生产的代码,这些代码跨越了几行以上,还需要一段时间。 以下是AI将如何在不久的将来影响软件开发的方式: AI将改进 它将变得擅长自动化任务,并帮助开发人员了解他们的选择。然后,它将让人类决定如何优化AI无法理解的情况。 AI将成为编码伙伴 软件开发人员将使用AI作为编码伙伴来编写更好的软件。如今已经在发生,并将随着AI学会一次编写多于几行代码而继续流行。开发人员将把AI配对编程工具包含在他们的IDE中,类似于人类配对编程,AI工具将根据提示执行编码任务,然后开发人员会审查代码。以往这个过程更加劳动密集,但AI工具可以比人类开发人员更快地执行他们SDLC的某些部分,使开发人员能够专注于更复杂的任务。 但程序员仍然很重要 程序员的真正价值不在于知道如何构建它,而是知道要构建什么。待AI学会如何解释每个功能和建议优先开发的商业价值还需要更长的时间,因此人类程序员的角色将始终存在。 如果AI写出可靠的代码会怎样? 这是一个很大的假设。大多数人类无法编写可靠的代码,而且AI只是一个分析大量人类编写的代码的应用程序。因此AI写出可靠代码的可能性很小。 大多数程序员都同意这一点。在CodeSignal最近的一项调查中,全球1,000名开发人员被问及他们对AI编码助手工具的使用情况。虽然81%的开发人员表示他们使用AI驱动的编码助手,但55%的受访软件工程师表示他们对AI生成的代码质量有顾虑。 所以,AI并不是提高代码质量的答案。 如何在今天提高代码质量 当前,我们可以通过静态代码分析可以提高代码质量,而不是通过用AI取代程序员来实现。 程序员编写代码,静态代码分析器确保代码符合编码规则;扫描代码以识别潜在的错误和安全漏洞;发现在代码审查和软件测试中通常被忽略的错误从而提高整体的代码和软件质量。 提高代码质量的最简单方法之一是使用静态代码分析工具。今天就开始你的免费试用。➡️ 注册免费静态分析试用 免费体验申请 marketing@polelink.com
  • 热度 3
    2024-5-15 10:35
    671 次阅读|
    1 个评论
    带你走近MISRA C++:2023
    随着汽车工业迈入数字化转型的新纪元,软件的安全性与可靠性已跃升为设计和开发核心环节的重中之重。MISRA C++标准的诞生与演进,精准地回应了行业发展的需求。自MISRA C++标准首次面世以来,它便被奉为汽车软件工程师在开发实践中的圭臬。 MISRA C++的发展史 MISRA C++的起源可以追溯到MISRA C标准的成功制定和广泛应用。MISRA C是一套针对C语言的编码规范,首次发布于1998年,它迅速成为汽车行业中软件安全性和可靠性的标杆。(回顾MISRA C:2012介绍请见文章 《带你走近MISRA C:2012》 )随着C++在工业界的普及,尤其是在汽车电子控制系统中,对C++的类似规范的需求日益增长。基于MISRA C的成功经验和市场需求,MISRA组织随后发布了适用于C++03标准的编码规范MISRA C++:2008。这是首个针对C++语言的MISRA标准,包含一系列的规则和指导原则,这些规则覆盖了从编程实践到代码设计等多个方面,旨在帮助开发者编写出更加安全和可靠的代码。 MISRA C++:2008规范发布后,得到了业界的广泛认可和采纳。它不仅在汽车行业中得到了应用,还扩展到了航空、医疗设备和工业控制等多个领域,并对这些行业产生了深远的影响。随着C++语言标准的不断更新和新特性的引入,MISRA C++:2008也在经历不断的修订和更新,以保持与C++标准语言的同步,并覆盖新出现的语言特性。 MISRA C++:2008与AUTOSAR C++14 但随着后续新版本C++标准的发布,MISRA C++:2008并未将新的C++语言特性纳入,于是AUTOSAR组织发布了AUTOSAR C++14编码规范。 AUTOSAR C++14在制定时,大量借鉴了MISRA C++:2008的规则。MISRA C++:2008是基于C++03标准制定的,而AUTOSAR C++14则是基于更新的C++14标准。AUTOSAR C++14吸收了约91%的MISRA C++:2008规则,并对其进行了扩展和更新,引入了针对C++11/14特性的规范。 MISRA C++:2023 MISRA C++:2023发布于2023年10月,这是MISRA C++的最新版本。它为使用ISO/IEC 14882:2017定义的2017语言版本(C++:17) 开发的安全关键型软件的组织提供指导。 MISRA C++:2023规则分类 MISRA C++:2023整合了AUTOSAR C++14编码规范, 共179条准则。这些规则按照性质分为两类: Rule(规则)和Directive(指令),包含175条Rule和4条Directive。规则有三种不同类别:” Mandatory(强制)”、” Required(要求)”和“Advisory(建议)”, Mandatory类别的规则中包含5条Rule,Required规则中包含122条Rule和4条Directive,Advisory规则中包含48条Rule。 图1 MISRA C++:2023规则分类 图2 MISRA C++:2023规则类别 MISRA C++:2023还引入了MISRA C++的Rule可判定性分类。可判定性区分标准为是否能在任何情况下明确回答“该代码是否遵循了这条规则?”这个问题。 图3 Rule的可判定性分类 要注意的是,可判定性并不适用于Directive规则。 接下来让我们进一步了解MISRA C++:2023编码规范。 什么是 MISRA C++:2023 Rule 9.5.2,为什么它很重要? MISRA C++:2023 引入了 Rule 9.5.2:“ for 范围初始值设定项最多应包含一个函数调用” ,以避免在基于范围的 for 语句的 for 范围初始值设定项创建临时对象时可能发生的未定义行为。 为了理解为什么会发生这种情况,让我们仔细看看基于 C++ 范围的 for 循环。 什么是 C++ 中基于范围的 for 循环? 在编程中,循环用于重复代码块。当我们知道要在代码块中循环多少次时会使用for循环。C++ 基于范围的 for 循环是在 C++11 中引入的,作为容器迭代的简洁表示法。传统循环源自 C 语言,具有可选的循环初始化,然后是循环条件,最后是循环增量表达式。 传统for循环可用于迭代容器,如下所示: std::vector v = { "Example", "vector", "of", "strings" }; for ( auto &&i = v.begin(); i != v.end(); ++i ) { std::cout << *i << “ “; } std::cout << std::endl; 使用基于范围的for时,迭代器的使用是隐式的: for ( auto &&s: v ) { std::cout << s << “ “; } 对于同一循环,这是一个更简单的表示法。C++ 语言标准指出它是以下方面的缩写: { auto && __range = v; auto __begin = __range; auto __end = v.end(); for (; __begin != __end; ++__begin) { auto &&s = *__begin; std::cout << s << “ “; } } 但是,这种表示法存在一定的局限性。在上面的示例中, __range 是用 v 初始化的,这是一个更简单的变量,但也可以使用一个复杂的表达式,为其创建多个临时对象。 让我们考虑使用一个函数,该函数返回字符串的向量,并具有: 一个输出用空格分隔的字符串的循环,如上所述; 第二个循环,打印第一个字符串的字母,用空格分隔: std::vector createStrings() { return { "Example”, "vector", "of", "strings" }; } int main() { for ( auto w: createStrings() ) { std::cout << w << " "; } std::cout << std::endl; for ( auto c: createStrings() ) { std::cout << c << " "; } std::cout << std::endl; } 如果我们执行此操作,第一个循环将按预期运行,但第二个循环将调用未定义的行为 。 问题是 createStrings() 有两个函数调用。最里面的调用是 createStrings 的调用 ,最外面的调用是对索引运算符 的调用。 未定义行为的原因是 “ createStrings ”返回的临时对象 用作“ operator ”调用的参数,因此,根据 C++ 的规则,临时对象的生存期不会延长。 MISRA C++:2023 Rule 9.5.2 如何防范未定义的行为 MISRA C++:2023 Rule 9.5.2 旨在防止这种情况。 MISRA C++:2023 引入了规则 9.5.2,该规则要求for范围初始值设定项最多应包含一个函数调用。 它还建议通过在循环范围之前的单独声明中执行内部函数调用来解决此问题。例如: auto strings = createStrings(); for ( auto c: strings ) { std::cout << c << " "; } 现在,初始值设定项中只有一个函数调用,因此生存期扩展具有所需的效果,并且行为已完全定义。 请注意,此问题已在 C++23 中得到解决,其中初始值设定项的所有临时项的生存期已扩展到整个 for 语句。(原文请参考《 Avoiding Bugs in Range-Based For-Loops with MISRA C++:2023®》 ) 关注更多MISRA C++2023内容请见直播回放《汽车行业为何需要MISRA C++:2023》,本期课程我们联合了嵌入式静态分析领域公认的行业领导及先驱Perforce公司,并邀请到其合规总监Jill Britton女士探讨在这项汽车行业调查中的发现并介绍MISRA C++2023为何如此重要。 使用 Helix QAC 执行 MISRA C++:2023 规则 Perforce 的 Helix QAC 是一款静态分析工具,在提供 MISRA C 和 MISRA C++ 合规性检查以及许多其他有价值的分析功能方面处于领先地位。 Helix QAC 通过其标准合规性模块为 MISRA C++:2023 规则提供 100% 的强制执行覆盖率,现已推出。 作为Perforce公司的合作伙伴,北汇信息将为客户提供优质的静态代码测试工具和服务,欢迎您发邮件到marketing@polelink.com,申请Helix QAC免费试用。