软件学报杂志

发表咨询:400-808-1731

订阅咨询:400-808-1751

软件学报杂志 北大期刊 CSCD期刊 统计源期刊

Journal of Software

  • 11-2560/TP 国内刊号
  • 1000-9825 国际刊号
  • 2.86 影响因子
  • 1-3个月下单 审稿周期
软件学报是中国科学院软件研究所;中国计算机学会主办的一本学术期刊,主要刊载该领域内的原创性研究论文、综述和评论等。杂志于1990年创刊,目前已被上海图书馆馆藏、CSCD 中国科学引文数据库来源期刊(含扩展版)等知名数据库收录,是中国科学院主管的国家重点学术期刊之一。软件学报在学术界享有很高的声誉和影响力,该期刊发表的文章具有较高的学术水平和实践价值,为读者提供更多的实践案例和行业信息,得到了广大读者的广泛关注和引用。
栏目设置:理论计算机科学、系统软件与软件工程、模式识别与人工智能、数据库技术、计算机网络与信息安全、计算机体系结构

软件学报 2019年第05期杂志 文档列表

软件学报杂志智能化软件新技术专刊
智能化软件新技术专刊前言1203-1205

摘要:智能化软件新技术是使用人工智能与机器学习技术辅助软件工程的新兴技术.近年来以深度学习为代表的人工智能技术飞速发展,在计算机科学的各个领域中都开始发挥重要作用.随着软件工程领域对数据积累的重视,人工智能技术在软件开发过程中的应用也逐渐增加.利用人工智能技术辅助软件工程中的代码编写、纠错、测试等具体工作,可以大量节省人工劳动,提升软件开发效率.将人工智能技术更好地与软件工程的各个环节相结合,进一步提升软件开发过程的自动化、智能化程度,是智能化软件新技术研究的主要关注点.

基于深度学习的程序生成与补全技术研究进展1206-1223

摘要:自动化软件开发一直是软件工程领域的研究热点.目前,互联网技术促进了开源软件和开源社区的发展,这些大规模的代码和数据成为自动化软件开发的机遇.与此同时,深度学习也在软件工程领域开始得到应用.如何将深度学习技术用于大规模代码的学习,并实现机器自动编写程序,是人工智能与软件工程领域的共同期望.机器自动编写程序,辅助甚至在一定程度上代替程序员开发程序,极大地减轻了程序员的开发负担,提高了软件开发的效率和质量.目前,基于深度学习方法自动编写程序主要从两个方面实现:程序生成和代码补全.对这两个方面的应用以及主要涉及的深度学习模型进行了介绍.

可微分抽象机混合编程系统1224-1242

摘要:自动化编程是智能软件的核心挑战之一,使用程序执行轨迹或输入输出样例学习程序,是自动化编程的典型研究方法.这些方法无法弥合常规程序元素与神经网络组件间的隔阂,不能吸收经验信息输入、缺乏编程控制能力.给出了一种可无缝结合高级编程语言与神经网络组件的混合编程模型:使用高级编程语言元素和神经网络组件元素混合开发应用程序,其中,编程语言描述程序的框架、提供经验信息,关键复杂部分则用未定、可学习的神经网络组件占位,应用程序在可微分抽象机上运行生成程序的连续可微分计算图表示,然后使用输入输出数据,通过可微分优化方法对计算图进行训练,学习程序的未定部分,自动生成完整的确定性程序.可微分抽象机混合编程模型给出了一种能够将编程经验与神经网络自学习相结合的程序自动生成方法,弥合编程语言元素与神经网络元素间的隔阂,发挥并整合高级过程化编程和神经网络可训练学习编程各自的优势,将复杂的细节交给神经网络未定部分自动生成,降低编程难度或工作量,而适当的经验输入又有助于未定部分的学习,同时,为复用长期积累的宝贵编程经验提供输入接口.

C/C++程序缺陷自动修复与确认方法1243-1255

摘要:在计算机软件中,程序缺陷不可避免且极有可能造成重大损失.因此,尽早发现并排除程序中潜在的缺陷,是学术界和工业界的普遍共识.目前的程序缺陷自动修复方法大都遵循缺陷定位、修复候选项生成、选择及验证的流程,但在修复实际程序时存在修复率低、无法保证修复结果的正确性等问题.提出了一种基于程序合成的C/C++程序缺陷自动修复方法.首先,从满足相同规约的程序集中,通过人工整理的方式总结错误模式及其对应的修复方法,使用重写规则表达错误模式,在此基础上实现了基于重写规则和基于程序频谱的缺陷定位方法,得到程序中可能的缺陷位置;其次,基于重写规则,使用修复选项生成方法得到缺陷的修复选项,同时,通过深度学习的方式学习正确程序的书写结构,帮助预测错误程序错误点应有的语句结构,通过这两种方式提高候选项质量,进而提高修复率;最后,在选择验证过程中,使用程序合成的方法将样例程序作为约束,保证合成后代码的正确性.基于上述方法实现了原型工具AutoGrader,并在容易出错、缺陷典型的学生作业程序上进行了实验,结果显示,该方法对学生作业程序中的缺陷有着较高的修复率,同时也能保证修复后代码的正确性.

示例演化驱动的学生程序自动修复1256-1268

摘要:已有的程序自动化调试研究大多面向工业软件,而学生程序调试具有缺陷数多、类型复杂等特有难点问题,因此,针对学生程序设计应用背景,研究程序自动修复方法,利用模板示例程序指导补丁的演化.改进了遗传编程算法,包括适应度的计算、变异体的生成方式和变异位置及操作的选择方式,使其更加适合修复学生程序.提出了基于示例的静态错误定位方法,能够识别缺陷程序和参考程序差异和可能的变异操作,有效地缩小补丁的搜索空间以提高修复的准确性.提出了基于执行值序列的变量映射方法,以降低变异体的编译错误,提高修复的准确性.在此基础上,设计并实现了示例演化驱动的Java学生程序自动修复系统.实验结果表明,该方法可以修复含有多缺陷学生程序,对于所用的测试集,当学生程序只有1个~2个错误时,修复率将近100%;当含有3个缺陷时,修复率约为70%;当含有4个及以上缺陷时,修复率约为50%.

基于频繁模式挖掘的GCC编译时能耗演化优化算法1269-1287

摘要:演化算法通过搜寻GCC编译器最优编译选项集,对可执行代码的能耗进行改进,以达到编译时优化嵌入式软件能耗的目的.但这类算法未考虑多个编译选项之间可能存在相互影响,导致了其解质量不高且收敛速度慢的问题.针对这一不足,设计了一种基于频繁模式挖掘的遗传算法GA-FP.该算法在演化过程中利用频繁模式挖掘得到出现频度高且能耗改进大的一组编译选项,并以此作为启发式信息,设计了"增添"和"删减"两种变异算子,帮助提高解质量和加快收敛速度.与Tree-EDA算法在5个不同领域的8个典型案例下进行对比实验,结果表明,该GA-FP算法不仅能够更有效地降低软件能耗(平均降低2.5%,最高降低21.1%),而且还能在获得不劣于Tree-EDA能耗优化效果的前提下更快地收敛(平均加快34.5%,最高加快83.3%),最优解中编译选项的相关性分析进一步验证了所设计变异算子的有效性.

即时软件缺陷预测研究进展1288-1307

摘要:软件缺陷预测一直是软件工程研究中最活跃的领域之一,研究人员己经提出了大量的缺陷预测技术,根据预测粒度不同,主要包括模块级、文件级和变更级(change-level)缺陷预测.其中,变更级缺陷预测旨在于开发者提交代码时,对其引入的代码是否存在缺陷进行预测,因此又被称作即时(just-in-time)缺陷预测.近年来,即时缺陷预测技术由于其即时性、细粒度等优势,成为缺陷预测领域的研究热点,取得了一系列研究成果;同时也在数据标注、特征提取、模型评估等环节面临诸多挑战,迫切需要更先进、统一的理论指导和技术支撑.鉴于此,从即时缺陷预测技术的数据标注、特征提取和模型评估等方面对近年来即时缺陷预测研究进展进行梳理和总结.主要内容包括:(1)归类并梳理了即时缺陷预测模型构建中数据标注常用方法及其优缺点;(2)对即时缺陷预测的特征类型和计算方法进行了详细分类和总结;(3)总结并归类现有模型构建技术;(4)总结了模型评估中使用的实验验证方法与性能评估指标;(5)归纳出了即时缺陷预测技术的关键问题;(6)最后展望了即时缺陷预测的未来发展.

基于特征迁移和实例迁移的跨项目缺陷预测方法1308-1329

摘要:在实际软件开发中,需要进行缺陷预测的项目可能是一个新启动项目,或者这个项目的历史训练数据较为稀缺.一种解决方案是利用其他项目(即源项目)已搜集的训练数据来构建模型,并完成对当前项目(即目标项目)的预测.但不同项目的数据集间会存在较大的分布差异性.针对该问题,从特征迁移和实例迁移角度出发,提出了一种两阶段跨项目缺陷预测方法 FeCTrA.具体来说,在特征迁移阶段,该方法借助聚类分析选出源项目与目标项目之间具有高分布相似度的特征;在实例迁移阶段,该方法基于TrAdaBoost方法,借助目标项目中的少量已标注实例,从源项目中选出与这些已标注实例分布相近的实例.为了验证FeCTrA方法的有效性,选择Relink数据集和AEEEM数据集作为评测对象,以F1作为评测指标.首先,FeCTrA方法的预测性能要优于仅考虑特征迁移阶段或实例迁移阶段的单阶段方法;其次,与经典的跨项目缺陷预测方法 TCA+、Peters过滤法、Burak过滤法以及DCPDP法相比,FeCTrA方法的预测性能在Relink数据集上可以分别提升23%、7.2%、9.8%和38.2%,在AEEEM数据集上可以分别提升96.5%、108.5%、103.6%和107.9%;最后,分析了FeCTrA方法内的影响因素对预测性能的影响,从而为有效使用FeCTrA方法提供了指南.

C程序内存泄漏智能化检测方法1330-1341

摘要:内存泄漏在采用显式内存管理机制的C语言中是一种常见的代码缺陷,内存泄漏的检测方法目前主要是静态分析与动态检测.动态检测开销大,且高度依赖测试用例;静态分析目前被学术界和工业界广泛应用,但是存在大量误报,需要人工对检测结果进行确认.内存泄漏静态分析的误报通常是由于对指针、分支语句和全局变量分析的不准确性导致的.提出了一种内存泄漏的智能化检测方法,通过使用机器学习算法学习程序特征与内存泄漏之间的相关性,构建机器学习分类器,并应用机器学习分类器进一步提高内存泄漏静态分析的准确性.首先构建机器学习分类器,然后通过静态分析方法构建从内存分配点开始的SparseValueFlowGraph(SVFG),并从中提取内存泄漏相关特征,再使用规则和机器学习分类器进行内存泄漏的检测.实验结果显示,该方法在分析指针、分支语句和全局变量时是有效的,能够提高内存泄漏检测的准确性,降低内存泄漏检测结果的误报.最后,对未来研究的可行性以及面临的挑战进行了展望.

基于深度学习的API误用缺陷检测1342-1358

摘要:开发人员经常需要使用各种应用程序编程接口(application programming interface,简称API)来复用已有的软件框架、类库等.由于API自身的复杂性、文档资料的缺失等原因,开发人员经常会误用API,从而导致代码缺陷.为了自动检测API误用缺陷,需要获得API使用规约,并根据规约对API使用代码进行检测.然而,可用于自动检测的API规约难以获得,而人工编写并维护的代价又很高.针对以上问题,将深度学习中的循环神经网络模型应用于API使用规约的学习及API误用缺陷的检测.在大量的开源Java代码基础上,通过静态分析构造API使用规约训练样本,同时利用这些训练样本搭建循环神经网络学习API使用规约.在此基础上,针对API使用代码进行基于上下文的语句预测,并通过预测结果与实际代码的比较发现潜在的API误用缺陷.对所提出的方法进行实现并针对Java加密相关的API及其使用代码进行了实验评估,结果表明,该方法能够在一定程度上实现API误用缺陷的自动发现.

一种基于深度学习的上帝类检测方法1359-1374

摘要:上帝类是指某个承担了本应由多个类分别承担的多个职责的类.上帝类违背了分而治之的基本思想以及单一职责的设计原则,严重影响软件的可维护性和可理解性.但上帝类又是一种比较常见的代码坏味.因此,针对上帝类的检测与重构一直是代码重构领域的研究热点之一.为此,提出了一种基于深度神经网络的上帝类检测方法.该方法不仅利用了常见的软件度量,而且充分利用了代码中的文本信息,意图通过挖掘文本语义揭示每个类所承担的主要角色.此外,为了解决有监督深度学习所需的海量标签数据,提出了一种基于开源代码构造标签数据的方法.最后,基于开源数据集对所提出的方法进行了实验验证.实验结果表明,这些方法优于现有的上帝类检测方法,尤其是在查全率上有大幅度的提升(提高了35.58%).

基于维修日志的飞机设备故障原因判别方法1375-1385

摘要:在飞机维修与保养过程中,航空维修公司已积累了大量经验性的维修日志数据.合理利用该类维修日志,结合机器学习方法,可以辅助维修人员做出正确的故障诊断决策.首先,针对维修日志的特殊性,提出一种迭代式的故障诊断基本过程;其次,在传统的文本特征提取技术的基础上,基于领域内信息,提出一种基于卷积神经网络(convolution neural network,简称CNN)的小样本文本特征提取方法,在样本量较少的情况下,利用预测目标将字向量作为输入,得到更为充分的文本特征;最后,使用随机森林(random forest,简称RF)模型,结合其他故障特征判别飞机设备的故障原因.卷积神经网络以故障原因为目标,预先对故障现象中的字向量进行训练,从而得到更能反映该领域的文本特征.与其他文本特征提取方法相比,该类方法在小样本数据上得到了更好的效果.同时,将卷积神经网络与随机森林模型应用于飞机设备的故障原因判别,并与其他文本特征提取方式和机器学习预测模型进行对比,说明了该类文本特征提取方式和故障原因判别方法的合理性和必要性.

基于代价极速学习机的软件缺陷报告分类方法1386-1406

摘要:在所有的软件系统开发过程中,Bug的存在是不可避免的问题.对于软件系统的开发者来说,修复Bug最有利的工具就是Bug报告.但是人工识别Bug报告会给开发人员带来新的负担,因此,自动对Bug报告进行分类是一项很有必要的工作.基于此,提出用基于极速学习机的方法来对Bug报告进行分类.具体而言,主要解决Bug报告自动分类的3个问题:第1个是Bug报告数据集里不同类别的样本数量不平衡问题;第2个是Bug报告数据集里被标注的样本不充足问题;第3个是Bug报告数据集总体样本量不充足问题.为了解决这3个问题,分别引入了基于代价的有监督分类方法、基于模糊度的半监督学习方法以及样本迁移方法.通过在多个Bug报告数据集上进行实验,验证了这些方法的可行性和有效性.

基于嵌入模型的混合式相关缺陷关联方法1407-1421

摘要:社交化编程使得开源社区中的知识可以快速被传播,其中,缺陷报告作为一类重要的软件开发知识,会含有特定的语义信息.通常,开发者会人工地将相关的缺陷报告关联起来.在一个软件项目中,发现并关联相关的缺陷报告可以为开发者提供更多的资源和信息去解决目标缺陷,从而提高缺陷修复效率.然而,现有人工关联缺陷报告的方法是十分耗费时间的,它在很大程度上取决于开发者自身的经验和知识.因此,研究如何及时、高效地关联相关缺陷是对于提高软件开发效率十分有意义的工作.将这类关联相关缺陷的问题视为推荐问题,并提出了一种基于嵌入模型的混合式相关缺陷关联方法,将传统的信息检索技术(TF-IDF)与深度学习中的嵌入模型(词嵌入模型和文档嵌入模型)结合起来.实验结果表明,该方法能够有效地提高传统方法的性能,且具有较强的应用扩展性.

代码坏味对软件演化影响的实证研究1422-1437

摘要:代码坏味是指程序设计中存在的不良设计模式或设计缺陷.坏味的存在,被认为会阻碍软件的演化与维护.近年来,研究人员致力于探究坏味产生的影响以及坏味与软件演化之间的关系.已有研究表明,代码坏味会随着软件的演化而不断发生变化.通常,软件的演化将涉及源文件的增加、修改与删除这3类具体操作,了解代码坏味与软件演化中源文件操作的关系,将有助于开发者更好地计划软件开发过程和重构软件代码.因此,针对13种常见的坏味,在8个Java项目共计104个版本中进行了系统的实证研究.研究发现,随着软件版本的演化,含代码坏味的文件在整个项目中的占比在不同的项目中呈现出不同的特征.另外,包含代码坏味的文件更倾向于被修改,而坏味本身与文件的添加或者删除并没有太大的关联.更进一步地,在探究的所有坏味中,有几种特定的坏味对文件的修改产生了显著的影响,且这些坏味文件间存在着明显的重叠.这些发现有助于开发人员更好地了解代码坏味,以便于更好地对软件进行维护.

面向持续集成测试优化的强化学习奖励机制1438-1449

摘要:持续集成环境下的测试存在测试用例集变化大、测试时间有限和快速反馈等需求,传统的测试优化方法难以适用.强化学习是机器学习的一个重要分支,其本质是解决序贯决策问题,可以用于持续集成测试优化.但现有的基于强化学习的方法中,奖励函数计算只包括测试用例在当前集成周期的执行信息.从奖励函数设计和奖励策略两个方面开展研究.在奖励函数设计方面,采用测试用例的完整历史执行信息替代当前执行信息,综合考虑测试用例历史失效总次数和历史失效分布信息,提出了两种奖励函数.在奖励策略方面,提出对当前执行序列的测试用例整体奖励和仅对失效测试用例的部分奖励两种策略.在3个工业级被测程序进行实验研究,结果表明:(1)与现有方法相比,所提出的基于完整历史执行信息奖励函数的强化学习方法可以大幅度提高持续集成测试序列的检错能力;(2)测试用例历史失效分布有助于发现潜在失效的测试用例,对强化学习奖励函数的设计更加重要;(3)整体奖励与部分奖励两种奖励策略受到被测程序的多种因素影响,需要根据实际情况具体选择;(4)包含历史信息的奖励函数会增加时间消耗,但并不影响测试效率.

敏感变量和感知机结合的测试预言生成方法1450-1463

摘要:测试预言生成技术是软件工程测试领域的研究热点之一.没有可以利用的历史测试用例是目前大部分测试预言生成技术的普遍假设,但是这种假设会使我们错过利用现有部分测试用例协助自动生成新测试用例预言的机会.在已知部分测试用例集的情况下,提出了基于敏感变量和线性感知机的新测试用例的测试预言自动生成方法.首先,收集已知测试用例执行的语句覆盖和不同断点处内存值集合作为训练集,计算与新测试用例执行覆盖信息高度相似的测试用例集;其次,计算各断点处表征成功或失败的敏感变量集;然后,应用线性感知机求解每个断点处成功或失败概率预测的门限值;在此基础上,给出新测试用例测试预言自动生成的方法,并对方法进行讨论;最后,采用7个程序的129个故障版本作为实验对象,对共计14 300个测试用例生成测试预言.实证评价表明,测试预言准确率平均达到96.2%.该成果可以形成测试用例集合构造的"滚雪球效应",不断迭代自动生成新测试用例的测试预言.

基于SOM神经网络的二阶变异体约简方法1464-1480

摘要:二阶变异测试通过向源程序中人工注入两个缺陷来模拟程序实际的复杂缺陷,在软件测试中具有重要意义.但由一阶变异体组合形成二阶变异体后数量会急剧增长,极大地增加了程序的执行开销.为了减少二阶变异体数量,降低程序的执行开销,提出一种基于SOM神经网络的二阶变异体约简方法.该方法首先采用较为全面的二阶变异体错误组合策略,对一阶变异体组合形成二阶变异体;然后,根据二阶变异体执行过程中的中间值相似性,进行基于SOM神经网络的变异体聚类.使用经典的基准程序和开源程序进行了方法的验证,实验结果表明,一方面,使用错误覆盖更为全面的组合策略能够充分模拟程序的复杂缺陷,聚类约简后,二阶变异体的个数在极大减少的同时,二阶变异充分度和一阶变异充分度更加接近,但是因为执行的二阶变异体数目明显降低,从而使得运行聚类后的二阶变异体时间开销明显比执行全部二阶变异体降低;另一方面,实验过程发现了有利于增加测试组件的隐藏二阶变异体.