细粒度软件缺陷预测模型构建方法

news2025/1/23 5:00:27

        在软件缺陷预测领域,粒度指的是缺陷库中每条样本的项目粒度.其中可以分为类粒度、文件粒度或者包粒度等。不同的开发语言有不同的层级的模块粒度,在软件缺陷预测领域,一般来说,在预测效果能够满足要求的情况下,粒度越小,预测的结果的可用性越强,可用公开训练数据越少,预测模型构建难度也越高,粒度越大,预测的结果的可用性越小,可用公开训练数据越多,预测模型构建难度也越低。

        绝大多数数软件缺陷预测方法都是基于粗粒度模块进行缺陷预测的。工程实践却需要细粒度模块的预测结果。因此,细粒度软件缺陷预测有意义且十分迫切。主要从两个方面入手:一方面从现有的细粒度预测方法存在的问题入手;另一方面从优秀的粗粒度预测模型向细粒度转化入手;最终将研发出性能优秀的细粒度软件模型。

        在主要的细粒度缺陷预测方法中,Giger的研究相对成熟且其进行的实验能够复制。然而我们发现在实际环境中,Giger的研究在实际环境中性能不突出。一个缺陷预测模型的两个重要组成部分是度量元和学习模型,而具体的学习模型对缺陷预测模型影响并不大,所以导致当前细粒度缺陷预测在实际应用环境中性能不佳的最可能的原因是度量元。一般来说,对于测试人员来说,过程度量元很难获取到,所以应将重心放到重新选择产品度量元上。众多的产品度量元中,代码语义是既可行又有效的度量。在此基础上可以构建基于代码语义的细粒度软件缺陷预测模型。模型的构建过程如图1所示。

      1 抽取AST

       为了能够真实的保留代码的完整语义,并且能够在机器学习中应用,在静态分析阶段,除了获取一般的静态分析指标及数据外,还要为每个函数生成AST。

        2 嵌入

        为了能够使用LSTM构建预测模型,需要将将每个AST节点输入到一个LSTM单元中。既然LSTM单元仅接受向量形式的输入,就需要将AST节点的节点名,映射到固定长度的具有连续值空间的向量中,我们将这个过程称为嵌入。

         嵌入过程带来两点好处:首先,嵌入后向量的维度减少了;另外,在相似上下文中经常出现的AST节点相互靠近了。

        具体包括如下几个步骤:

        (1)将AST节点转化为特征向量

        (2)获取所有子节点向量

         根据输入AST节点对应的特征向量,得到该节点的每个子节点对应的特征向量。

        (3)获取子节点的隐藏状态向量和上下文向量

        获取每个子节点(递归)的隐藏状态向量和上下文向量,用于计算父节点的隐藏状态向量和上下文向量,对各子节点的隐藏状态向量求和作为父节点LSTM树节点的输入。

        (4)信息嵌入

        每个LSTM细胞中有三个门,分别叫做遗忘门(ftk )、输入门(it)和输出门(ot)。每个门利用一个sigmoid函数计算取值。若sigmoid函数返回0,意味着这个门禁止任何信息通过;若sigmoid函数返回1则说明门允许所有输入信息通过;若sigmoid函数的返回值在0和1之间,则输入的部分信息可以通过此门。

        LSTM树中每个子节点对应一个遗忘门。有多少新信息存储到记忆单元中的由两个机制控制:首先,用sigmoid函数计算输入门的值,这个值决定哪个值将会得到更新。接着,使用tanh函数创建一个新候选值向量,这个向量将会添加到记忆单元中。通过用每个节点的旧记忆乘以遗忘门的数值,新的记忆被更新,抛开前面决定忘记的信息。

        累加所有子节点上下文向量后在同备选上下文向量相加,最后,输出是由输出门控制的过滤后的记忆版本。

        最后,使用tanh函数将记忆单元向量各维数值处于-1到1之间,接着同输出门相乘,使得仅有被选择的部分被输出。

        3 训练LSTM树

        以非监督模式训练Tree-LSTM单元,

        (1)输入训练数据

        给LSTM单元输入训练数据中的一个AST分支,得到那个分支预测的父节点名称

        (2)比较预测结果同实际输出结果的差异;

        (3)调整模型参数以缩小二者的差异

        这个过程迭代进行直到所有训练数据用尽。

       4 训练分类器

       上一过程能够获取训练集中所有模块对应的特征,将这些带有标记和特征信息的模块灌入到分类器中让分类器通过训练集学习。在机器学习领域,有多种分类器可供选择。因此提供一个开发的分类选择器,以便在不同的应用场景下选择恰当的分类器。当前测试策略中先提供逻辑回归和随机森林两个分类型。

      5 预测

      (1)获取被预测模块的AST

      (2)将AST根节点输入到LSTM树中,得到对应的隐藏状态向量和上下文向量

      (3)将特征向量输入到分类器中获取是否存在的限的概率

      (4)得到预测结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

map容器(重要)

1、map容器简介 Map容器中所有的元素都会根据元素的键值自动实现排序。Map中所有的元素都是pair,pair的简介 同时拥有实值和键值,而前面的 set 只是拥有 键值,pair 中的 第一个元素是键值,而第二个值是 实值。Map 中是不允许有两…

Maven的进阶操作

系列文章目录 Maven进阶操作的学习 文章目录系列文章目录前言一、分模块开发与设计二、依赖管理1.依赖传递2.可选依赖3.排除依赖三、继承与聚合1.聚合2.继承四、属性1.属性2.版本管理五、多环境配置与应用1.多环境开发2.跳过测试六、私服1.私服简介2.私服仓库分类3.资源上传与…

IDEA的基本使用

IDEA的基本使用IDEA的基本使用1 IDEA概述2 IDEA的下载和安装2.1 下载2.2 安装3 IDEA中层级结构介绍3.1 结构分类3.2 结构介绍project(项目、工程)module(模块)package(包)class(类)3…

C#基础学习--委托

委托 什么是委托 可以认为委托是持有一个或多个方法的对象。 委托和类一样,是一种用户自定义的类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定操作。 可以通过一下擦欧总来使用委托: 可以把d…

度量,我们如何以终为始,以始为终?

你好,我是黄俊彬。 很多时候在研发过程中,我们都习惯性地用“拍脑袋”的方式来看待一个事情。例如这个代码写得不好、这个自动化测试覆盖不充分、版本的发布频率太差了等等。往往只知道哪里有问题,但是却不知如何去找出根因,真正…

14、MyBatis-Plus入门到进阶

1、Mybatis的问题 【简介】: 每个实体类对应一个实体类,对应一个mapper接口,对应一个mapper.xml文件,每个mapper接口都有重复的crud方法,每一个mapper.xml都有重复的crud的sql配置。 2、Mybatis-plus简介 1、官网 Mybatis-plusMybatis-plus 2、MyBatis是什么&a…

JS常用字符串方法

📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录移除字符串首尾空白符trim()trimStart()trimEnd()获取字符串指定位置的值ch…

记2023第十四届蓝桥杯感受

弱校ACM队员,曾获CB国二,CG国优第六。(我是fw) ------------------------------------------------------------------------分割线 2023.04.09 今年再次参加CG组,估计g了,盲猜一波省二前排,出…

基于BenchmarkSQL的Oracle数据库tpcc性能测试

基于BenchmarkSQL的Oracle数据库tpcc性能测试安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库用户配置BenchmarkSQL压测装载测试数据TPC-C压测(固定事务数量)TPC-C压测(固定时长)生成测试…

C++轻量级Web服务器TinyWebServer源码分析之http篇

文章目录http篇简介一、服务器接收http请求和http报文解析解析报文整体流程从状态机逻辑主状态机逻辑二、服务器响应请求报文http篇简介 http类这篇个人觉得是最难同时也是最繁琐的一篇,本篇在基础知识方面,包括epoll、HTTP报文格式、状态码和有限状态机…

Python 小型项目大全 71~75

七十一、声音模拟 原文:http://inventwithpython.com/bigbookpython/project71.html 类似于西蒙电子玩具,这款识记游戏使用第三方playsound模块,播放四种不同的声音,分别对应键盘上的A、S、D、F键。当你成功地重复游戏给你的图案时…

驱动保护 -- 通过PID保护指定进程

一、设计界面 1、添加一个编辑框输入要保护的进程PID,并添加两个按钮,一个保护进程,一个解除保护 2、右击编辑框,添加变量 二、驱动层代码实现 1、声明一个受保护的进程PID数组 static UINT32 受保护的进程PID[256] { 0 }; 2…

Python Web开发技巧II

Postman安置Cookie 对于大型项目而已,所携带的cookie往往都不止一个,而是一堆,甚至特别特别长,postman文档提供的cookie操作是全局的,但需要一个一个打(折磨),唯一的优点就是作用域…

tocbot生成文章目录

学习链接 github上的tocbot npmjs上的tocbot 效果图 使用步骤 1. 安装tocbot npm install tocbot --save2. vue组件中使用引入tocbot 只需要引入tocbot,然后调用tocbot.init(…),指定提取的文章内容所在的dom,以及要把生成的目录放到哪个…

4月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年4月3日-4月9日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营能力强的B站…

Flink (十一) --------- Table API 和 SQL

目录一、快速上手1. 需要引入的依赖2. 一个简单示例二、基本 API1. 程序架构2. 创建表环境3. 创建表4. 表的查询5. 输出表6. 表和流的转换三、流处理中的表1. 动态表和持续查询2. 将流转换成动态表3. 用 SQL 持续查询3. 将动态表转换为流四、时间属性和窗口1. 事件时间2. 处理时…

PDF怎么转换成word格式?这三个方法转换效率很高

在日常办公生活中,我们经常需要对文件进行格式转换,尤其是将PDF文件转换为可编辑的Word文件。虽然在Office软件中将Word文件转换为PDF很容易,但是将PDF文件转换为Word文件却需要一些技巧。在保证安全性能的前提下,如何将PDF文件转…

回溯算法编程题集合(leetcode)

给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 示例 1: 输入: nums [4, 3, 2, 3, 5, 2, 1], k 4 输出: True 说明: 有可能将其分成 4 个子集&#x…

【springboot】ApplicationListener用法及源码

用法 方法一:继承ApplicationListener 传递事件 继承于ApplicationEvent public class ForDebuggerEvent extends ApplicationEvent {public ForDebuggerEvent(Object source) {super(source);}public void executeEvent() {System.out.println("ForDebugge…

第四章 网络层

网络层服务 网络层需要实现的两项重要功能: 转发;当通过一条输入链路接收到一个分组后,路由器需要决策通过哪条输出链路将分组发送出去,并将分组从输入接口转移到输出接口路由选择;当分组从源主机流向目的主机时&…