tag 标签: 静态代码测试

相关博文
  • 热度 3
    2024-5-15 10:35
    366 次阅读|
    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免费试用。
  • 热度 9
    2023-5-4 10:01
    868 次阅读|
    0 个评论
    Helix QAC 2023.1 对 MISRA C:2012修订版4和MISRA C:2023的覆盖率为100%,对 AUTOSAR C++14的覆盖率为96%。它还更新了CWE最新版本v4.10的合规模块。 在这一版本中Helix QAC和Validate平台的集成也有重大改进,Validate平台提供了软件对跨工程以及Perforce静态分析产品的软件洞察力。 编码标准覆盖范围( MISRA C:2012修订版4、MISRA C:2023、AUTOSAR 和 CWE) MISRA针对C程序设计语言的软件开发指南。这些指南的目的是促进嵌入式系统上下文中的代码安全性、安全性、可移植性和可靠性。 • 100%覆盖 MISRA C:2012 修订版4,包括新规则和 3 条指令以及对现有指南的更新。 • 新的指南涵盖了额外的C11/18特性,包括对Threads和Atomics标准库的使用,以及对现有特性的新规则。 Helix QAC也对MISRA C:2023有100%的覆盖度,该指南将以前的修订、修正和技术整合为一个单一的、全面的版本。MISRA C:2023将于今年晚些时候出版。 AUTOSAR AUTOSAR C++ 14 的覆盖率已提高到 96%。 CWE 更新了 CWE C 和 CWE C++ 合规模块,以与最新版本的 CWE 4.10 保持一致。 Perforce Validate 持续安全性和代码合规性平台为嵌入式和关键任务应用提供功能安全性、安全性、可靠性和质量保证。 Validate平台为整个组织的代码库提供分析数据、趋势和配置的集中存储,为所有Perforce Static Analysis产品提供独立平台。 2023.1 改进了 Helix QAC 和Validate平台之间的集成。 • 将问题抑制状态与Validate连接的项目同步 ○ 桌面 GUI 和 Eclipse IDE 插件 • 最新版本的项目基线支持 • Streams 功能为单个代码库提供变体、分支和版本的管理和高效报告 • 改进了使用Helix QAC桌面工具和Validate之间的Validate和QAC GUI/CLI诊断一致性生成的MISRA合规报告 • 改进了使用 Validate 和 QAC GUI/CLI 生成的 MISRA 合规性报告 Helix QAC 桌面工具和验证之间的诊断一致性 • 上传性能改进 • WebAPI 功能,用于与 SDLC 中的其他工具和流程集成 提高生命质量 CLI • 最新版本工程的Validata基线支持( qacli 基线) • Validate独立的检查器和忽略功能 ( qacli 上传) • 抑制同步 GUI • 验证依赖项检查和忽略能力 • 抑制同步到桌面 • MISRA 合规报告和标准合规报告的改进 Eclipse IDE 插件 在IDE插件中Validate的连接支持 RCMA • 分析存储器的使用和效率的提高 Helix QAC 2023.1中的重要改变 停止使用公告 CCT Generator在2023停止使用 Helix QAC 2023.1将不再支持传统的独立CCT生成工具。 Helix QA C2021.3中引入的’qainject’工具将取代当前的CCT发生器。因此,使用遗留工具生成的CCT将被弃用,不再受支持。 从 QAC软件包中移除不支持的静态CCT 通过使用带有’qainject’的自动CCT生成,改进了对各种编译器的构建监控, 到2023.1,以前包含在Helix QAC软件包中的大多数静态CCT将被删除。自动生成的与使用静态默认CCT相比,CCT有望提供更准确的分析结果。除了GCC、Visual Studio和通用编译器之外,所有的静态CCT都被移除了。 ➡️ 立即体验最新版Helix QAC,发送邮件至info@polelink.com