0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >技术信息 > 使用人工智能减轻MISRA的负担

使用人工智能减轻MISRA的负担

来源: embedded
2022-12-19
类别:技术信息
eye 19
文章创建人 拍明芯城

原标题:使用人工智能减轻MISRA的负担

  在开发过程中引入静态代码分析工具可能是一项艰巨的任务,特别是对于具有现有代码库的正在进行的项目。除了努力选择一组适当的准则或建立工作流程之外,团队还经常努力应对生产力下降的问题,这些违规行为是由于最初需要解决的大量违规行为来声称符合标准。大量违规通常可以分组为由相同代码构造引起或源自类似代码模式的结果群集,即使它们违反了不同的准则。基于作者身份或项目结构将静态分析结果分发给开发人员的经典方法被证明是无效的。

1.jpg

  我将分享关于人工智能和机器学习如何减少实现最先进汽车软件的MISRA合规性的内部研究结果。我们探索了各种机器学习技术,对静态分析结果进行聚类和排序,以优化修复工作。

  将 SA 引入您的组织

  静态分析 (SA) 是消除可能影响软件安全性、安全性和可靠性的软件错误的有效方法。静态分析也被广泛用作关键系统开发的防错技术。至于预防,业界有几种编码标准,它们为安全使用编程语言功能和结构提供了指导。MISRA C 和 MISRA C++ 是安全关键系统开发中使用的最流行的 C 和C++编码标准之一。符合 MISRA 等编码标准通常是实现整体符合 ISO 26262、IEC 62304、EN 50128 等功能安全标准的强制性步骤。

  然而,在开发过程中引入静态代码分析和编码标准执行是一项艰巨的任务,也是一项重大投资。

  我提出了一个开发工作流程,其中包括几种基于 ML 的技术,用于静态分析结果的分类和优先级排序,以优化开发人员在实现符合编码标准(如 MISRA)方面的工作。实验工作流包括以下分类和优先级划分技术:

  将问题分类为要修复和要忽略的问题

  根据特定团队成员的技能对违规行为进行分组

  根据根本原因对违规进行分组

  将违规分组到在修复策略方面相似的集群中

  所讨论的工作流程已经在 Parasoft 的内部代码库上进行了内部测试。我们选择用于衡量生产率提高的指标之一是修复静态分析违规所花费的平均时间。该指标的计算方法是:所有开发者在修复违规行为时花费的总时间除以已解决的违规行为总数(已修复或禁止显示/偏离)。该指标也是为每个开发人员单独计算的。研究和实验是在没有学术严谨的情况下进行的,因此我们不分享详细的结果,我们承认需要更多的研究来充分评估开发人员生产力的提高,但初步结果非常有希望。

  强制实施合规性

  强制遵守编码标准(如 MISRA)需要持续监控代码库。在理想情况下,团队将从空代码库开始,不允许合并不合规的代码。使用这种方法,强制实现合规性是一项更简单的任务,它侧重于控制新代码的小增量。在现实生活中,这永远不会是真的。项目开始时使用了大量预先存在的代码,这些代码通常与标准合规性相去甚远。虽然在某些情况下,预先存在的代码被决定从合规性中排除,但在大多数情况下,开发团队面临着消除继承代码的不合规性并确保根据标准创建新代码的挑战。

  通常,违规积压包含不同类别的违规。随机选择要解决的问题会导致合规流程中的大量效率低下和工作重复。开发过程中的低效率会分散开发人员的注意力并阻碍合规性流程的采用。

  通过引入额外的自动分类和优先级技术,可以提高合规性流程的采用及其有效性,这些技术使用 ML 对静态分析结果进行后处理,以将它们分组到集群中,并推荐解决这些问题的最佳顺序,并将问题预先分配给团队中最擅长解决问题的个人。

  分类和优先级技术分析

  研究揭示或确定了可用于自动对违规行为进行分类并将其预先分配给特定团队成员的几个方面:

  要修复的违规行为与可忽略的调查结果

  需要特定技能的违规行为

  具有相同根本原因的违规行为

  类似代码中的违规行为

  下面我们将讨论区分每个类别的价值,描述分类算法并提出如何使用这些信息来优化开发工作流程。

  A 部分 – 将违规行为分为“待修复”和“忽略”

  团队认为是噪音的静态分析结果在合规过程中是不可避免的。它们可能是由于分析不准确而报告的误报警报,也可以是团队认为可以接受并选择偏离编码标准的合法问题。SA噪声是一个重大问题,阻碍了静态分析和延迟对重要发现的反应。开发人员不是首先修复可能在整个代码库中传播的“战略”问题,而是处理同质违规队列,其中包括低优先级或可忽略的发现与关键问题混合在一起。自动区分“真实”问题和“噪音”的能力大大提高了开发人员的工作效率。

  Parasoft 的静态分析解决方案使用基于 ML 和 AI 的分类将违规行为分为“待修复”和“忽略”类。系统使用违规元数据(例如其作者、规则、模块、分支和从解析树中提取的特殊特征)作为模型的输入。模型通过专用的手动会话(开发人员对问题进行分类)或自动模式(使用历史数据)进行训练。模型经过充分训练后,将用于自动对违规进行分类。默认情况下,系统使用 RandomForst 分类器,可以在解决方案的配置中将其更改为其他分类器,如 AdaBoost 或 BaggingClassifier。分类器的输出,其中“待修复”违规的优先级高于“忽略”, 传递到违规处理链中的下一步。

  B 部分 – 对需要特定技能进行补救的违规行为进行分组

  在大多数开发团队中,单个开发人员都有自己的专业领域或技术配置文件。通常,这与他们以前的经历有关。例如,开发人员 A 可能是 POSIX 线程编程方面的专家,而开发人员 B 可能非常精通 UDP 套接字。

  同时,在违规积压工作中,可能存在与 POSIX 线程或 UDP 套接字相关的代码中的违规群集,或者与这些主题以某种方式相关。同样,可能存在需要特定知识的编码指南。

  我们提出了一个假设,即通过在解决问题时观察开发人员,我们可以建立反映他们的技能和技术专长的个人资料。此过程包括聚类冲突,并允许用户在处理从不同聚类随机分配的特定问题时将其评为“喜欢”或“不喜欢”。

  配置文件构建发生在训练 AI 模型的初始阶段。这种方法的灵感来自流行的多媒体流媒体平台。

  准备好用户技术技能配置文件后,系统会确定新违规行为的优先级,并了解特定问题是否与给定开发人员匹配。显然,假设开发人员在处理属于其专业领域的问题时工作效率更高,速度更快。过滤算法基于矩阵分解方法。这种方法的生产力提高是显而易见的,尤其是在使用大型代码库和团队时。

  不过,我们预计会出现两个潜在的问题。首先,一些用户在不断修复相同类型的问题时可能会感到恼火,其次,这种方法不会促进开发团队的自我教育和敏捷性。在我们的本地实验中,我们没有观察到这类问题,但很明显,静态分析结果的无组织分布减少了疲劳,并迫使开发人员学习代码的随机部分并拓宽他们的专业知识。

  在这一领域还需要进行更多的研究,但我们认为,通过将一定比例的随机选择的违规行为引入特定于开发人员的自动优先级队列,可以减轻这些负面影响。

  C 部分 – 将违规行为与相同的根本原因分组

  可用于对违规行为进行分组的另一个特征是根本原因。对于规则的子集,它们可能会因为相同的代码构造而生成冲突。通过消除代码中的相同问题来查找可以删除的违规群集有助于开发人员最大限度地提高投资回报率并快速减少违规积压的大小,从而简化合规性流程管理。

  在我们的实验工作流程中,我们应用了 Parasoft 静态分析解决方案的现有功能来识别具有相同根本原因的违规集群。该系统现在可用于通过数据和控制流分析识别的特定违规子类。这些发现通过堆栈跟踪进行报告,该堆栈跟踪记录了根本原因与代码中问题出现的位置之间的所有步骤。这些与堆栈跟踪相关的附加元数据简化了比较违规和识别由同一构造引起的违规。我们尝试了不同的方法来比较违规行为,并确定它们是否具有共同的根本原因。我们的实验包括基于AI的算法。最后,选择了一种经典的方法,其中比较了违规的堆栈跟踪, 使用一些启发式方法来简化比较替代路径。

  在我们的实验中,我们假设集群需要有五个以上的违规。我们在内部代码库中发现的最多的违规集群有几十个发现。优先级引擎根据违规数量对集群进行排序,并将其传递到处理链的下一阶段。

  D 部分 – 对位于类似代码中的违规进行分组

  修复静态分析冲突需要了解报告问题的位置周围的源代码。这是对代码进行安全修改的关键步骤。获得这种理解并创建源代码的心理形象有时是一项要求苛刻且耗时的活动。在会话中处理许多违规时,用户需要从一个上下文跳转到另一个上下文,重建他们对不同代码块的理解。这是非常低效的。

  在我们的工作流程中,我们构建了一个系统的原型,该系统分析所选违规周围的代码块,并扫描其他违规,选择类似代码块中的违规。建议将位于类似代码块中的冲突作为开发人员在工作会话期间的下一个任务。该功能允许开发人员修复多个问题,同时减少耗时的代码分析所花费的时间。

  我们的系统建立在 代码2VEC 开源,一个通用模型。该模型使用公开可用的代码库进行预训练。Code2vec 用于矢量化给定的代码块并将其转换为包含数百个浮点数的向量。一旦开发人员在会话期间修复了第一个违规,就会执行此转换。然后,查询系统是否存在具有表示源的类似向量的其他违规行为。如果队列中存在具有足够接近的源代码向量的其他违规行为,则建议开发人员将其作为工作会话中的下一个任务。

  为了进一步提高系统的准确性和有效性,我们尝试了算法的扩展,除了源代码相似性之外,在计算向开发人员建议的下一个违规的“接近度”时,还包括违规相似性。假设是,如果存在两个相似的违规,并且它们位于相似的代码块中,则连续修复它们会更容易。此算法的扩展需要额外输入被视为相似的静态分析规则组。为此,我们使用MISRA C 2012标准的原始章节作为分组,例如具有两个规则的“8.6类型”章节,具有四个规则的“8.7 文本和常量”章节以及具有十四条规则的“8.8声明和定义”章节。在我们的研究中, 标准同一章节的规则被认为是相似的。

  与仅考虑代码块的相似性的初始方法相比,此扩展的结果非常有希望,并且建议的质量明显更高。不过,需要更多的研究和工作来更好地将编码标准的规则划分为几组。

  优化编码标准合规性工作

  在我们在 Parasoft 内部测试的工作流程中,我们将上述 A 部分和 B 部分中描述的技术结合在链中,用于处理、分类和分发违规行为。我们将 Parasoft 产品的现有功能用于 A 部分和 C 部分中描述的技术,并且我们为 B 部分和 D 部分中描述的技术构建了一个原型解决方案.具有所述实验工作流程的静态分析用于包含非安全关键代码的内部 C/C++ 代码库。

  实验工作流程功能齐全,使开发人员能够处理自动预先分配给他们的静态分析结果。在工作流的训练阶段,用于分类的 AI 模型是在随机选择的违规的初始子集上手动训练的。

  在工作流的第一步中,根据 A 部分中描述的算法将违规分类为“待修复”和“要忽略”.分类为“待修复”的违规优先于分类为“要忽略”的违规,以确保开发人员首先关注重要发现。

  在工作流的第二步中,系统根据特定团队成员的技能和经验将违规行为分组到预先分配给特定团队成员的队列中,如 B 部分所述。此步骤可确保开发人员专注于他们最有效的问题。在我们的实验分类和优先级链中,我们将这个块放在第二个位置,就在过滤“噪音”的初始步骤之后。第一步的输出与开发人员无关。从第二步开始,系统为每个团队成员维护单独的违规队列。

  在第三步中,系统将各个开发人员队列中的违规行为分组到具有与 C 部分中描述的相同根本原因的项目集群中。此步骤可最大限度地提高投资回报率。

  在工作流的最后一步中,系统会在开发人员修复问题时观察他们的活动,并在其队列中查找类似于刚刚修复的代码中的其他发现。此步骤可优化开发人员的工作效率。

  组合链将违规行为传送到各个开发人员的托盘中,因为他们正在处理调查结果。静态分析违规通过基于 Web 的界面向开发人员启用。我们还启用了导入到 VSCode 编辑器的功能。在我们的研究中,我们为工作流程引入了一个训练阶段,开发人员预先训练用于 A、B 和 C 部分中描述的技术的 AI 模型。

  结论

  我们专注于使用本文档中描述的指标来提高生产力,以实现符合 MISRA 编码标准的合规性。我们比较了为基本静态分析解决方案计算的指标值和我们的实验设置。

  根据开发人员的不同,我们观察到修复或抑制问题所需的平均时间减少了 21-28%。整个团队修复单个违规所需的时间平均减少了 23%。初步结果非常有希望,并决定将实验装置产品化。我计划继续研究,以精确量化生产力的提高。

  


  米罗斯瓦夫·齐林斯基 是嵌入式测试解决方案的产品经理 帕拉软.Miroslaw 的专长包括 C/C++、RTOS、静态代码分析、单元测试、管理安全关键型应用程序的软件质量以及软件符合安全标准。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯