论文翻译-Applying Software Metrics to RNN for Early Reliability Evaluation

文章提出了一种基于RNN和软件度量的早期软件可靠性评估方法,通过RNN识别易出错代码块,并利用DTMC计算模块及整体可靠性。实验表明,该框架在两个开源项目中表现出良好的适用性和有效性,为早期可靠性工程提供了新的思路。

Applying Software Metrics to RNN for Early Reliability Evaluation

将软件指标应用于RNN以进行早期可靠性评估

Hao Zhang

摘要

结构建模是软件可靠性建模的重要分支,用于早期的可靠性工程,用来优化架构设计并指导后续测试。

与使用测试数据的传统模型相比,由于缺乏实际数据,结构模型通常难以应用。本文提出一种基于软件度量的方法用于实证研究。

递归神经网络(RNN)用于处理度量数据,以识别容易出错的代码块,并且指定的聚合方案用于计算模块的可靠性。在此基础上,提出了框架工作来评估实际项目的整体可靠性,其中引入代数工具来自动准确地构建结构可靠性模型

对于两个开源项目的研究表明,基于此框架的早期评估效果是有效的,相关方法具有良好的适用性。

1.Introduction

软件可靠性工程旨在提高软件质量,其作用涵盖软件生命周期。更多研究表明在软件开发的早期阶段实施的可靠性工程可以显著降低潜在的风险,例如从后期阶段重新工作。 结构可靠性模型在早期可靠性工程中工作,但由于缺乏建模参数,难以应用到实际项目,大多属于基于测试失败数据的传统软件增长模型(SRGMs)。

在结构可靠性模型中,马尔可夫模型基于状态并且强调基于特定粒度的结构分析,有半马尔可夫模型(SMP)离散时间马尔可夫链(DTMC)、连续时间马尔科夫链(CTMC),并不常用在实例中。 以DTMC为例,很难从实际项目中获得建模之间可靠性和组件之间控制转移概率所需的两个参数。

研究目标:直接从软件代码中获取必要的信息,而无需测试失败数据,提出一个完整的可靠性建模和有设计和编码的周期计算框架。

从不同角度测量代码的软件指标已经应用于质量分析和实际项目中的缺陷预测。

2.方法框架

2.1研究框架

研究框架。已经训练过的RNNs对当前评估版本中一个模块的所有类别进行分类。指定的方案接收类信息并且将它们聚合到模块可靠性。DTMC被用于计算整体可靠性。

实际度量数据会根据其特征分为6类,作为RNN模型的输入。从软件的不同版本收集的这些数据用作一系列RNN模型的输入。当一个版本被确定为要进行评估的当前版本时,将对它的历史版本的数据训练出相应的RNN模型,以便分离出容易出现缺陷的类。分类结果汇总到模块可靠性中,和使用所有获取的参数一起建立DTMC模型,以计算整体可靠性。工程的正式工具将用于促进DTMC的应用。

2.2RNN模型

使用的是多对一RNN模型,右边是展开式,U、V、W都是均匀权重矩阵,在反向传播中使用仅存在于输出o(t)和目标Y(t)之间的损失函数L来更新模型参数。 虚线箭头表示计算顺序,对于用于训练的历史版本,根据实际测试结果,每个模块中的所有类都用具体y(t)表示

RNN有一个隐藏层,从初始状态s(0)向前传播,从s(1)到s(t)的每次步骤公式如下:

b、c:偏置向量 tanh():双曲线正切函数,是输入层和隐藏层之间最常用的激活函数。 sigmoid():逻辑函数,被用于输出函数,是因为这里只处理二分类问题(容易出错 / 可靠)。 L():损失函数,是L2的正则化,用于避免过拟合。

首先计算 s(t) 的梯度 ,并且基于受控的梯度下降 更新矩阵V的权重。 然后递归计算 从 s(t-1) 到 s(1) 的所有状态的坡度。矩阵 U 和 W 在迭代的过程中更新,被称为随时间反向传播(BPTT)。

2.3可靠性建模和正式工具

结构可靠性模型可以在不测试故障数据的情况下计算软件可靠性。在框架中选择离散时间马尔可夫链模型,是最流行的模型,因为它使用类似于工作流程的图来描述模块之间的控制-传输关系。假设模块 Ni 具有可靠性度量 Ri,和转移概率 Pi,j、产品RiPi,j 表示模块 Ni 已经成功执行d然后转移到 Nj 的概率,这是马尔科夫链中一步转移的概率。

可以得到任何一对模块的一步概率,并且形成一个矩阵Q,称为一步随机传递矩阵。Qn被定义为一个n阶传递矩阵。

根据初始模块Nu设置S有u行,根据结束模块Nv设置v列,入口Su,v表示一个概率和, 包括了 从Nu到Nv的所有可能的传输路径的概率和。系统可能性Rsys的计算方式: Rv是Nv的可靠性,上述表示为成功到达Nv并且成功执行Nv的概率。

DTMC模型简单有效地强调了局部结构对于整体系统的影响,并且适用于软件开发早期的可靠性建模。 但是在实际应用中有困难: 1、参数Ri和Pi,j在实际应用中并不容易知道; 2、DTMC模型的构建。大多数DTMC模型都基于有向图,实际上目前并没有工具来支持这种图形的自动创建。随着模块数量的增加,图形表示和计算会变得更加复杂和困难。然而仅仅使用有向弧不足以表示本地结构中模块之间的所有关系,例如并行性。

在早期研究中提出了使用方便的工具用于DTMC建模,基本思想是:使用代数表达式Ni⊕Nj 来表示图表中Ni->Nj的弧。符号operator表示模块之间的激励行为,表示控制转移的产生。这种正向表达的优点是它足够精确明确,特别是在处理更加复杂和更大规模的情况时。

3.实验设计

3.1项目和数据集

两个开源项目 jEdit和Apache Ant,在PROMISE存储库(最重要的软件指标数据库)中有同样的版本长度,进行以下工作:

设置度量数据:表1中设置当前版本为4.3和4.7,尽管这两个版本都不是最后一个稳定版本,但都规模适当并且代表开发技术; 分析结构信息:因为本工作是执行早期的可靠性工程,因此可认为自己是开发人员和设计师,可以得到必要的来自设计文档的结构信息和源代码。

表2列出两个目标版本的结构信息,包括项目描述和某些模块的规模,并且用N1、N2等做标记 粒度:软件包级别 jEdit4.3:23个软件包(模块),496个文件、492个类 Ant1.7:15个软件包(模块),785个文件、745个类

4.RNN的度量数据

软件指标分为3类:传统指标,面向对象(OO)指标和过程指标。 有时传统和OO被称为代码度量。PROMISE的数据分别在方法级别,类级别和文件级别收集。代码行数(LOC)和循环复杂度(CC)仍然可以在一个类中验证方法级别,这些类用来测量代码的基本大小。在类和文件级别,Chidamber-Kemerer(CK)方法被广泛应用,例如方法之间的凝聚力(CAM)、类的响应(RFC)和继承树的深度(DIT)。

本文的来自PROMISE库的度量数据:复杂性、耦合、内聚、继承性、规模和进程 在表3中六个方面确定容易出现缺陷的类,训练6个RNN来解决二分类问题 以RNN-c2为例,是耦合类型的模型,首先初始化U、V、W然后设置b、c和s(0)为0,一组由度量数据向量组成的输入序列用于训练RNN-c2模型。表4展示了在项目jEdit中处理BrowserView类时的输入序列。

输入序列时由四个版本号排序的确定序列,对应于四个向量x(1)~x(4),向量x(5)被视为测试数据。本文为所有模块中的所有类定义相同的序列,并使用x(5)作为测试输入。在其他五个类别的RNN使用同样的训练方法。jEdit训练集的整体规模为492,Ant为745。

4.1聚合策略

提出 将RNN的结果汇总到一个模块的可靠性程度,并计算目标项目的可靠性的值 的策略。

训练RNN将所有的类分为两类:容易发生缺陷和可靠。 因此,可以在每个方面计算容易缺陷类的总数,定义为失败类(DPC),标记训练数据: 1)对于某个版本,若一个类有错误提交,则被定义为DPC; 2)如果一个类的度量数据明显异常,则该类包含在表3中列出的度量的类别下定义为DPC;

当设置jEdit4.3和Ant1.7为要评估的当前版本时,假设历史版本存在错误报告。这意味着当前版本的类正处于开发中,目前还没有错误报告,这样一来,就反映了早期可靠性评估的难度,并且与实际情况密切相关。

一个模块中的样本的可靠性影响(RI)由下式定义: Ndpc(Ci):模块中容易缺陷的类的数量; Nall:模块类的总数; Ci:表示指定的方面(从C1复杂性到C6的进程) 如表4所示,输入向量x(5)=[28, 15, 21, 1, 4]T ,目前仅仅测试BrowserView类是在聚合方面容易发生缺陷,仍然需要完成其余五个方面的统计数据。

RI(可靠性影响)值与统计的可靠性有关。聚合策略与模块可靠性的计算密切相关。zhang等人指出,当构建模型来预测缺陷等级或计数时,求和策略通常可以达到最佳性能。本文使用求和策略将六个类别的可靠性影响(RI)聚合到单个模块的可靠性中。计算公式: ri:表示 ci 种类(易缺陷)的权重,这里 ri=1/6,因为每个类别代表不同的逻辑,这里使用均分。

在实际开发中,可靠性工程通常由项目经理实施。模块开发人员仅需要根据(6)(7)式来计算Rmodule的值。 这里介绍第2节中描述的正式工具,将模块应用于DTMC模型。假设模块开发人员可以根据对系统结构的理解提交Rmodule,而且可以提交相关的代数表达式。

例如,在项目 jEdit4.3 中 browser(N1) 的开发人员应该提交:①模块可靠性的值R1;②代数表达式 N1⊕N23。 这个表达式取代有向弧来描述N1和N23之间的控制传输流程。在jEdit4.3中,核心软件包记录为N23。这表示任务通过N1,并将被转移到核心模块。

提交的代数表达式证实了开发人员的设计意图,将工作流中的所有模块链接起来。项目经理和架构师也可以根据他们的整体理解直接修改表达式。作为一种典型的形式化方法,这里使用的代数表达式是精确和明确的,这对于软件工程师来说是一个轻量级且易于使用的工具。

实际管理者最终可以收集一个表达式集,该表达式隐含地包含DTMC模型所需要的两个关键参数:Ri和Pi,j 。 Ri 的计算过程:是目标开源项目中的第i个模块的可靠性; 转移可能性Pi,j :可以被Java静态代码分析工具估计。为了简单起见,这个概率是平均除以 Ni⊕Nj 所有可能的传递 部署ALR解析器,目的是扫描和解析所有的表达式,以计算总体项目可能性。

5.结果和讨论

5.1结果

在应用早期可靠性评估框架时,重要问题是找到适合两个实际项目的结构粒度。

本文在软件包级别上分析Java面向对象项目,软件包级别收集到的度量数据涵盖了在PROMISE存储库总的类和方法级别收集的所有度量数据。

图3以四个指标展示了jEdit4.3的八个模块的分布情况,并且附加了所有四个度量数据的总体分布以进行比较。 图中展示的是:不同的模块(包)显示出显著的差异,表现了功能、复杂性和编码风格的多样性。 这些差异表示可能存在的质量差距。这与jEdit项目的不同模块是由不同的人开发的事实是一致的。 此外,jEdit项目还是用了一些成熟的软件包,其开发周期甚至超过了项目本身。Ant项目也有类似情况。 以四个指标(例如八个不同的jEdit4.3软件包和整体软件包)进行数据分布的箱线图。 a:以DIT为代表的继承类别 b:以CBO为代表的耦合类别 c:以MAX_CC为代表的复杂类别 d:以RFC为代表的大小类别

本文使用TensorFlow1.4建立六个度量指标(C1-C6)的模型RNN-Ci,表5在一个包(例如jEdit4.3的browser包)中列出了六个RNN-Ci对于所有类的分类结果,1表示容易缺陷,0表示可靠。

使用(6)(7)公式,计算jEdit4.3的browser包的Rmodule值为88.33%,同样,项目中其他的软件包的Rmodule值也可计算。

表6列出了将jEdit4.1、4.2、4.3和Ant1.5、1.6、1.7作为待评估版本的部分Rmodule值的结果。二者有相同的版本长度。 介绍了两个项目的前六个模块,粗体指的是计算过程中可能遇到的特殊情况: 1)在jEdit4.3中bufferio/bufferset两个模块,都是新增的。实际上来源于前版本的模块缓冲区,一个模块的简化大大提高了模块缓冲器的可靠性值。符合原始设计。两个新模块的值只能通过没有时间序列估算,也就是第3节中的DPC规则。 2)Ant1.7中dispatch模块的值:属于最后一个版本中的真正的新功能模块,它的值也需要在不使用RNN的情况下估算。 3)Ant1.6中launch模块的值:在1.6中属于一个新功能模块,在1.7中使用RNN模型,这是需要构造一个具有相同值的全长序列。

通过DTMC模型和形式化工具计算两个Java项目的三个版本的可靠性。从可靠性工程的角度,除了Rmodule的值以外,还需要模块开发人员提供模块之间的关系,可以通过代数表达式进行描述。对于jEdit4.3,可以建立如下表达式的集合来替换DTMC的图形表示形式:

N24是构建用于指示终止状态的虚拟模块。对应于DTMC模型的结束节点。N24的Rmodule值为100%。大多数模块都迁移到核心模块N23,并且N23⊕N24表示业务终止要求仅由N23启动。在jEdit4.1、4.2和Ant1.5、1.6、1.7中,构建了一组代数表达式,使用虚拟模块表示终端节点。LR分析器自动解析这些表达式,以完成系统可靠性的计算。

使用不同的输入序列进行验证,此外,两个传统的可靠性模型--经典的G-O模型和Huang的模型以用于性能比较。二者都属于增长模型,前者是经典模型的代表,后者由于测试工作的整合而具有出色的预测性能,这两个模型用于测试失败数据,这些数据根据官方网站上的错误报告获得,但是不能用于早期可靠性评估。

图4显示了针对不同学习率的jEdit4.1、4.2、4.3和Ant1.5、1.6、1.7提出框架的评估结果。首先将初始学习率η设为5,初始正则化率λ设为1。曲线与预期存在出入。然后将学习了设为0.5和0.05进行试验,发现随着学习率变小,曲线趋势越发一致。

5.2讨论

如图4、5所示,所提出的方法的可靠性值通常低于传统模型的值,这是因为图1框架中建立的计算过程致力于查找那些不一定导致软件故障的易出错类,换句话说,软件代码缺陷的放大 导致本研究中可靠性评估的结果相对保守,相比之下,传统模型更加乐观,因为它们认为一个软件项目的可靠性曲线会随着错误修复而继续增加。

通过不断调整不同的学习率和正则化率,可以得到当学习率为5时,两个目标项目的曲线大不相同,增长缓慢的曲线表明RNN的更新与输入序列中的变化不匹配,通过降低学习率,发现在本研究的数据尺度下,参数的优化最佳值在10-2次方。

本研究的适用性:框架中的DTMC模型是当前最重要的结构模型,建模所需的软件度量数据可以从公共存储库PROMISE获得,也可以从源代码获取。在软件缺陷预测的大多数文献研究中普遍接受度量元素和在实验中使用的分类。后续使用:相关分析将被应用于消除类似指标中的冗余信息。

6.结论

本研究提出一个完整的框架,以便在两个开源的Java项目中实现早期的可靠性工程。 使用RNN模型来处理度量数据,目的是在一个包中识别容易缺陷的类,并基于可靠性影响和聚合策略的定义来计算包的模块可靠性。

然后引入形式化工具来自动构建结构可靠性模型并计算整体可靠性。

实验表明,该方法的结果可以接近 使用故障数据的传统可靠性模型的结果。 该方法在软件设计和编码阶段工作,可以适应这些阶段的任何结构变化和代码变化。 该研究为结构可靠性模型的实际应用提供了思路,该模型在可靠性工程中发挥重要作用。

期望:下一步的实证研究应针对更大规模,更长期的开源项目进行。此外,结构分析方法可以用来优化本文的框架,揭示软件项目变更过程中可靠性评估的结构变化的影响。

<think> 我们遇到了一个权限问题:在git rebase --continue时,由于.git/objects目录的权限不足,导致无法添加对象(写树失败)。 通常这是因为.git/objects目录的权限设置不正确,导致当前用户无法写入。 解决方案: 1. 检查.git目录的权限,确保当前用户有写权限。 2. 如果权限不对,可以尝试修改权限。 具体步骤: 首先,确认当前用户是否有权限: ls -la .git/objects 如果发现权限不对(比如所属用户或组不是当前用户,或者没有写权限),可以尝试以下方法修复: 方法1:修改.git/objects的权限(递归修改) sudo chown -R $(whoami) .git/objects sudo chmod -R u+rw .git/objects 注意:在多人协作的项目中,直接修改权限可能影响其他用户,需要谨慎。如果是个人仓库,则没有问题。 方法2:如果使用sudo运行git命令(不推荐,但临时解决) sudo git rebase --continue 但是,使用sudo会导致新创建的文件属于root,可能造成后续问题,所以最好还是修复权限。 方法3:检查是否磁盘空间满或者inode用尽(虽然错误信息是权限,但有时其他问题也会导致类似错误),可以使用命令检查: df -h # 检查磁盘空间 df -i # 检查inode使用情况 方法4:如果是在共享文件系统上,检查文件系统是否挂载为只读。 执行完权限修复后,再次尝试: git rebase --continue 如果问题依然存在,可能需要检查是否有其他进程锁定了该目录,或者尝试重新克隆仓库。 注意:在rebase过程中,如果操作不当,可能会遇到其他问题,建议在操作前确保工作目录是干净的,并且已经备份重要更改。 根据以上分析,给出具体操作步骤。 </think>这个错误表明您的 Git 仓库目录 `.git/objects` 存在权限问题,导致无法写入新对象。以下是详细解决方案: ### 原因分析 1. **权限不足** Git 需要向 `.git/objects` 写入临时文件时被拒绝 2. **常见场景**: - 使用 `sudo` 执行过 Git 命令导致文件所有权变更 - 多用户共享仓库时权限设置不当 - 通过 root 用户创建/克隆了仓库 --- ### 解决方案 #### 方法一:修复目录所有权(推荐) ```bash # 递归修复.git目录所有权 sudo chown -R $(id -u):$(id -g) .git # 修复写入权限 sudo chmod -R u+rw .git ``` #### 方法二:临时提权完成 rebase ```bash # 使用sudo完成当前rebase操作 sudo git rebase --continue # 完成后立即修复权限 sudo chown -R $(id -u):$(id -g) .git ``` #### 方法三:检查文件系统权限 ```bash # 1. 检查目录权限 ls -ld .git/objects # 2. 正常权限应为:drwxr-xr-x # 3. 如果异常,重置默认权限 find .git -type d -exec chmod 0755 {} \; find .git -type f -exec chmod 0644 {} \; ``` --- ### 预防措施 1. **避免混合使用 sudo** 普通 Git 操作永远不要使用 `sudo` 2. **仓库初始化规范** ```bash # 正确方式:以当前用户创建 git init git clone <url> ``` 3. **设置共享仓库权限** ```bash # 对共享仓库设置组写权限 chmod -R g+sw .git ``` --- ### 技术原理 ```mermaid graph TD A[git rebase --continue] --> B[创建临时对象] B --> C[写入.git/objects] C --> D{权限检查} D -->|通过| E[完成rebase] D -->|失败| F[insufficient permission错误] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值