摘要:本文围绕LIBRO技术的主要步骤进行介绍。
本文分享自华为云社区《【LLM for SE】顶会ICSE-2023发布LIBRO技术,利用大模型技术进行缺陷重现,自动重现率(33%)实现业界突破》,作者: 华为云软件分析Lab 。
随着大模型(Large Language Model, LLM)技术的发展,LLM在许多软件工程任务上表现出良好的效果,比如代码生成、搜索、对话等任务。近期,许多研究工作结合LLM技术和软件分析技术来解决软件工程领域的问题。软件工程顶级会议ICSE2023文章《Large Language Models are Few-shot Testers: Exploring LLM-based General Bug Reproduction》(来自韩国科学技术院大学的Shin Yoo团队)发布了LIBRO技术,是首个面向通用缺陷的自动重现工作。该技术有效利用大模型技术提升了缺陷重现技术的有效性,实现业界突破。实验结果表明,在主流数据集Defects4J中,LIBRO技术可根据缺陷报告自动生成测试用例并重现出251个缺陷(共750个缺陷),自动重现率达33%。LIBRO借助LLM技术在NLP领域的突出进展,在SE领域中的缺陷重现问题中实现重大突破。利用LLM的技术优势来提升SE领域的技术能力有望成为行业趋势,吸引越来越多的研究者和业界从业人员。
论文链接详见:http://arxiv.org/abs/2209.11515
以下围绕LIBRO技术的主要步骤进行介绍。如图1所示,LIBRO框架主要包括四个步骤,分别是:(A) 提示工程、(B) LLM查询、(C) 后处理、(D) 选择&排序。
步骤A(提示工程):在LLM技术中,如何构造有效的提示进行查询是一个关键问题。LIBRO基于缺陷报告构建提示信息,利用的信息包括缺陷报告的标题和描述信息。此外,LIBRO还在提示信息中加入测试用例实例引导大模型生成测试用例。下图给出了一个缺陷报告的实例和对应的提示信息。
步骤B (LLM查询):将之前构造的提示信息输入大模型,大模型将输出一个测试用例生成的结果。具体来说,LIBRO使用的大模型是基于GPT-3的CodeX模型。LIBRO构造的提示信息末尾是“public void test”,这会引导大模型生成一段测试用例代码。此外,LIBRO通过加权随机采样(weighted random sampling)来提升大模型查询效果,并生成多个测试用例作为备选测试用例。下图是基于之前例子里的提示信息生成的一段测试用例代码。
步骤C (后处理):LIBRO对大模型生成的测试用例的后处理指将测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖。具体来说,LIBRO首先根据测试类与测试用例函数的文本相似度来计算测试类和测试函数的映射关系。该策略在业界主流数据集中能够成功匹配89%的测试类与测试函数的关系,是一种有效的匹配策略。为了解决测试用例函数的依赖问题,LIBRO首先解析生成的测试用例函数,并识别变量类型以及引用的类名/构造函数/异常。然后,LIBRO通过在测试类中与现有import语句进行词法匹配,并过滤掉已经导入的类名。
步骤D (选择&排序):一个能够重现缺陷的测试用例指当且仅当测试用例因为缺陷报告中说明的缺陷而执行失败。换而言之,LIBRO生成能够重现缺陷的必要条件是:该测试用例在被测程序的错误版本中编译成功但是执行失败。该研究工作将这类测试用例称为FIB(Fail In the Buggy program)。LIBRO对大模型生成的若干测试用例进行选择和排序,从而优先推荐质量更高的生成结果。
LIBRO的选择和排序算法主要包括三种启发式策略:(1)如果测试用例执行失败信息和/或显示了在缺陷报告中提到的行为(比如异常或输出值),那么该测试用例可能是重现缺陷的测试用例。(2)LIBRO根据选择测试用例的集合大小来观察大模型生成的测试用例之间的一致性。直觉上,如果大模型生成大量相似的测试用例,那么说明大模型认为这类测试用例具有更高的可信度。即,这类测试用例是大模型达成的共识。(3)LIBRO根据测试用例的长度来决定它们的优先级,原因是短的测试用例更便于用户理解。
缺陷重现实例介绍:
以下是一个LIBRO重现AssertJ-Core项目中编号为2666的缺陷报告的真实案例介绍。如下截图Table VIII是实际缺陷报告,如下截图Listing 4是利用LIBRO生成的测试用例。缺陷报告中提到在特定条件下比较i和I会失败。LIBRO根据缺陷报告的描述自动生成了能够重现该缺陷的测试用例。
文章来自:PaaS技术创新Lab;PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!
PaaS技术创新Lab主页链接:http://www.huaweicloud.com/lab/paas/home.html
点击关注,第一时间了解华为云新鲜技术~
来源:ningyu1.github.io/20201230/encrypted-data-fuzzy-query.html我们知道加密后的数据对模糊查询不是很友好,本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路,希望对大家有所启发。为了数据安全我们在开发过程中经常会对重要的数据进行加密存储,常见的有:密码、手机号、电话号码、详细地址、银行卡号、信用卡验证码等信息,这些信息对加解密的要求也不一样,比如说密码我们需要加密存储,一般使用的都是不可逆的慢hash算法,慢hash算法可以避免暴力破解(典型的用时间换安全性),在检索时我们既不需要解密也不需要模糊查找,直接使用密文完全匹配,但是手机号就不能这样做,因为手机号我们要查看原信息,并且对手机号还需要支持模糊查找,因此我们今天就针对可逆加解密的数据支持模糊查询来看看有哪些实现方式。在网上随便搜索了一下,关于《加密后的模糊查询》的帖子很多,顺便整理了一下实现的方法,不得不说很多都是不靠谱的做法,甚至有一些沙雕做法,接下来我们就对这些做法来讲讲实现思路和优劣性。如何对加密后的数据进行模糊查询我整理了一下对加密的数据模糊查询大致分为三类
本文使用tf-idf(词频-逆文件频率)、lsi(潜在语义索引)和doc2vec(文档向量化嵌入)这3种最基础的NLP文档嵌入技术,对文本进行嵌入操作(即构建语义向量)并完成比对检索,构建一个基础版的文本搜索引擎。?作者:韩信子@ShowMeAI ?机器学习实战系列:https://www.showmeai.tech/tutorials/41 ?深度学习实战系列:https://www.showmeai.tech/tutorials/42 ?本文地址:https://www.showmeai.tech/article-detail/321 ?声明:版权所有,转载请联系平台与作者并注明出处 ?收藏ShowMeAI查看更多精彩内容在本篇内容中,ShowMeAI将带大家,使用最基础的3种NLP文档嵌入技术:tf-idf、lsi和doc2vec(dbow),来对文本进行嵌入操作(即构建语义向量)并完成比对检索,完成一个基础版的文本搜索引擎。?文档嵌入技术文档嵌入(docembedding)方法能完成文本的向量化表示,我们可以进而将文本搜索问题简化为计算向量之间相似性的问题。我们把『搜索词条』和
【问题现象】由于忘记域管理员密码或其他原因,导致域控制器无法登录。【产生原因】通常只有一个域管理员帐户,该管理员帐户密码又忘记了或其他原因导致密码不正确。【处理步骤】1、进入救援模式(winpe),导航到系统盘system32目录下,重命名osk.exe为osk_bak.exe,后续还需要改回来2、同目录下,复制一个cmd.exe副本,并将副本重命名为osk.exe3、(可选步骤)打开密码修改工具NTPWEdit,重置Administrator密码,正常情况下是可以重置的,但该案例比较特殊,用NTPWEdit无法重置密码(NTPWEdit的好几个版本都试了,都不行),忽略此步骤即可按照提示,清空Administrator密码也不起作用,看来NTPWEdit工具不适合该案例,忽略此步骤4、(可选步骤)创建备用管理员帐户。打开老毛桃密码恢复工具,目标路径指定到系统盘的Windows目录,点击“开始”,再点击“新建一个管理员用户”。此步骤创建admin备用帐户是可选的,也可以在第5步的cmd窗口完成,当然也可不创建备用帐户。输入管理员帐户的用户帐户和密码,点击“应用”5、此时,推荐重启进入安
Conjur策略简介每个Conjur工作流都以Conjur策略开始:无论是教程、演练、设置脚本、博客发布指引,其中都包含安全策略。这是因为Conjur中的所有内容都存在于安全上下文中。 安全是人类的概念,需要清晰的沟通工具。MAML(机器授权标记语言)策略是Conjur操作人员用来交流组织如何授予访问权限和维护控制权的主要工具。它就是安全策略即代码(securitypolicyascode)。 为了开始和MAML一起思考,让我们来看看Alice的故事,她是一个大型假设IT组织的高级安全工程师。她负责保护对数据库的访问,并部署了开源Conjur.org,以更好地控制特权数据库帐户。 1.角色让我们从最简单的MAML策略开始:单个用户。 ----!useraliceAlice加载代表其用户的此策略。目前,用户无权访问任何内容,并且该策略没有定义可以授予其访问权限的任何内容。但以后会有。 在Conjur中,用户是基于角色的访问控制(role-basedaccesscontrol)意义上的角色。每个用户代表一个人,比如爱丽丝。她的角色隐式地具有一个相关的秘密:一个ConjurAPI密钥。这是爱
Theocoacao有篇不错的介绍NSArray和KVC的文章,我给粗略翻译了一下。NSArray的-valueForKey:有一个不是很显著的特性.你可以使用它返回一个由tree对象包装的值对象的数组。这句话可能不是很容易理解,看下面的例子就清楚了。NSMutableArray*tree=[NSMutableArrayarray]; NSDictionary *p=nil; //parent NSDictionary *c=nil; //child NSNumber *n=nil; //value inti; for(i=0;i<10;i++) { n=[NSNumbernumberWithInt:i]; c=[NSDictionarydictionaryWithObject:nforKey:@"someKey"]; p=[NSDictionarydictionaryWithObject:cforKey:@"storage"]; [treeaddObject:p]; } NSLog(@"%@",
痛点在使用Springmvc进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8时间包下的具体类型参数来直接接收。同时还有一系列的序列化、反序列化问题,在返回前端带时间类型的同样会出现一些格式化的问题。今天我们来彻底解决他们。建议其实最科学的建议统一使用时间戳来代表时间。这个是最完美的,避免了前端浏览器的兼容性问题,同时也避免了其它一些中间件的序列化/反序列化问题。但是用时间表达可能更清晰语义化。两种方式各有千秋,如果我们坚持使用java8的时间类库也不是没有办法。下面我们会以`java.time.LocalDateTime`为例逐一解决这些问题。局部注解网上有很多文章说该注解是前端指向后端的,也就是前端向后端传递时间参数格式化使用的,这没有错!但是有一个小问题,该方式只能适用于不涉及反序列化的情况下。也就是以下场景才适用:@GetMapping("/local") publicMap<String,String>data(@DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")Loc
打开backend-ms文件夹下的logs文件夹里的log文件:首先找一连串的*****************************,这个醒目的标志代表一个新的从KOIApp发起的请求。第101行的method字段代表这是一个confirm请求,因为我们的目的是查看profileupdate请求,所以不用细看,一直往下滑动log:从这开始就是我们需要关注的了,和profileupdate请求相关的。下图的日志说明从KOIApp发送的请求已经成功被KOIApp对应的WebSocket服务器接收到了。即下图的第一步。 WebSocket服务器下一步会把这个请求投递给Orchestra。即下图的第二步。继续把日志往下滑,看到Orchestra已经从WebSocket服务器接收到请求了,即上图的第三步。Orchestra会把profileupdate的请求投递给同webshop连接的WebSocket服务器,即架构图的第四步。下面的log表明webshop对应的WebSocket服务器(即日志文件中的简写WSServer-for-Webshop)已经从Orchestra接收到了profil
实现intsqrt(intx)函数,计算并返回x的平方根。 样例:sqrt(3)=1 sqrt(4)=2 sqrt(5)=2 sqrt(10)=3复制二分法再0到x之间找,找到一个n使得n2=x或者(n2<x&&(n+1)2>x),这样的n就是需要的,用二分法来实现,因为x2这个函数也是单调的。intsqrt(intx){ intbeg=0; intend=x; intmid; while(beg<=end) { mid=beg+(end-beg)/2; if(pow(mid,2)==x||(pow(mid,2)<x&&pow(mid+1,2)>x)) { returnmid; } elseif(pow(mid,2)<x) beg=mid+1; else end=mid-1; } //writeyourcodehere }复制
作为移动端的分发入口,微信小程序虽然没有当初期望的那么火,但是却是一个不能忽视的入口。撇开微信小程序对于腾讯生态的原因不说,微信小程序对于开发还是很方便的,特别是对于白痴选手来说,基本不需要多少过多的学习,就能写一个不错的小程序。下面就微信小程序常见的组件分别做详细的介绍,本篇主要介绍picker组件。运行效果如下: picker选择器分为5种:分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器,可以用mode属性区分。属性普通选择器设置mode=selector。属性名类型默认值说明rangeArray/ObjectArray[]mode为selector或multiSelector时,range有效range-keyString当range是一个ObjectArray时,通过range-key来指定Object中key的值作为选择器显示内容valueNumber0value的值表示选择了range中的第几个(下标从0开始)bindchangeEventHandlevalue改变时触发change事件,event.detail={value:val
我们在写java程序的时候会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种: 1.invokespecial:调用私有实例方法; 2.invokestatic:调用静态方法; 3.invokevirtual:调用实例方法; 4.invokeinterface:调用接口方法; 5.invokedynamic:调用动态方法;这里我们通过一个实例将这些方法调用的字节码指令逐个列出。实例源码实例共两个java文件,一个是接口另一个是类,先看接口源码,很简单只有一个方法声明:packagecom.bolingcavalry; publicinterfaceAction{ voiddoAction(); }复制接下来的类实现了这个接口,而且还有自己的共有、私有、静态方法:packagecom.bolingcavalry; publicclassTest001implementsAction{ privateintadd(inta,intb){ returna+b; } publicStringgetValue(inta,intb){ returnString
近几年,国产半导体芯片高速发展,国家信创采购也在加大对国产芯片的扶持力度。9月26日,有投资者向龙芯中科提问称,“公司作为自主性最高的国产CPU企业,在今年信创领域计算机采购中却面临着近乎出局的局面,对信创这个国家战略实在是莫大的讽刺,请问对于而引进国外技术、严重依赖国外授权的兆芯、飞腾却占据了绝大多数信创份额的情形,公司计划如何应对?”对此,龙芯中科回应称:“今年总体处于项目交接期,桌面批量采购确实比较少。上半年公司信息化业务同比有大幅度下降,而竞品x86产品在信创市场的比例确实有提升,但‘近乎出局’的说法还是有失偏颇。国家战略方向是无比正确的,但政策的落地以及执行是需要过程的。”龙芯中科认为,自主化替代应该是体系的替代,而不仅仅是产品的替代,但事物的发展,包括人们的认知,和龙芯的发展一样都是波浪式发展、螺旋式上升的,请给予一定的时间和耐心。龙芯中科强调,公司坚持自主研发,一直致力于构建自主可控的信息技术体系和产业生态。公司的战略长期以来没有改变,前途是光明的,但道路是曲折的。不仅要撸起袖子加油干,还得耐着性子坚持干。产品方面,龙芯3A5000+7A2000的组合已经推出,提高了整机
问题 在当前版本vantweapp组件库中,sticky组件offsetTop属性类型为number,单位默认为px且无法更改,而小程序默认单位是rpx。这导致在一些场景下,如sticky的元素与顶部须保留一定距离,无法直接设置offsetTop。 解决 通过小程序API获取元素高度,动态设置offsetTop,达到适配目的。 <van-stickyoffset-top="{{offsetTop}}"> 复制 setOffsetTop(){ wx.createSelectorQuery() .select('.banner') .fields( { size:true, }, ({height})=>this.setData({offsetTop:height}) ).exec() } 复制 如果在自定义组件中,使用this.createSelectorQuery()代替wx.createSelectorQuery()。
题目传送门:https://ctf.bugku.com/challenges#%E7%99%BD%E5%93%A5%E7%9A%84%E9%B8%BD%E5%AD%90 题解: 下载题目,打开得到此文件 用UE打开,拉到文件末尾,发现类似flag格式的字符串,拷贝出来得到 fg2ivyo}l{2s3_o@aw__rcl@ 注意拷贝时,g前面的字母f是自动隐藏的,需要自己补上 分析 fg2ivyo}l{2s3_o@aw__rcl@ 感觉flag、{}等信息都在此字符串中,因此段断定是栅栏密码,但是栅栏密码进行解密时,需要指定加密时的分组,在这里就只能一个一个的试咯,我们发现当修改每组字数为3时,得到了flag 注意,提交答案时,后面的两个@符号应该去掉,它只是为了加密此字符串而添加的无关字符 因此,flag为:flag{w22_is_v3ry_cool} 附: 栅栏密码在线加解密链接:https://www.qqxiuzi.cn/bianma/zhalanmima.php
早上突然收到dnspod的宕机通知(好久没收到了,有点手足无措)。 服务器在上午10:40时达到85%。uptime显示cpu利用率达到35。不宕才怪。 按照之前的经验,应该是触发一个特别耗CPU的处理,把php-cgi重启就能立马恢复,之后再查看日志。 重启后立刻ok. 查看日志,调出那一时刻的日志一条一条的过,重点放在反应时间上。正常的处理时间应该在1秒内,发现很多在几十秒以上的日志,慢慢回溯,发现了最开始异常的记录,是多个提交comment的日志。 发现一连串的来自同一IP的高频率的浏览文章并发日志的行为(偶尔还会有同一IP段的其它IP,查了一下来自美国)。因为我们的评论审核是使用的第三服务,所以特别耗时间。 问题找到了,如何解决呢? 是停止使用审核功能呢,还是简单的将IP加入黑名单呢? 考虑的这一段时间apec还有一些国家会议在举行,对于审核还得慎重,采取的方法是先将这这一个IP段都加入黑名单。
HandshakefailedduetoinvalidUpgradeheader:null解决方案 解决方案,在Nginx,location中添加以下代码: proxy_set_headerUpgrade$http_upgrade; proxy_set_headerConnection"upgrade"; 复制 server{ listen80; server_namelocalhost; location/{ proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerHost$http_host; proxy_set_headerX-NginX-Proxytrue; #prevents502badgatewayerror proxy_buffers832k; proxy_buffer_size64k; proxy_passhttp://127.0.0.1:8080; proxy_redirectoff; #
安装docker 之前编写的博客有docker的安装教程 Kubernetes整体架构 Master k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求; MasterNode由APIServer、Scheduler、ClusterStateStore(ETCD数据库)和ControllerMangerServer所组成; Nodes 集群工作节点,运行用户业务应用容器; Nodes节点也叫WorkerNode,包含kubelet、kubeproxy和Pod(ContainerRuntime); 安装k8s 部署方式 选择使用kubeadm Kubeadm是一个K8s部署工具,提供kubeadminit和kubeadmjoin两个操作命令,可以快速部署一个Kubernetes集群; 官方地址 Kubernetes部署环境准备 关闭防火墙 systemctlstopfirewalld systemctldisablefirewalld 复制 关闭selinux sed-i's/enforcing/disabled/'/etc/selinux/config#
发送前一天的监控日志#!/bin/bash source/etc/profile time=`date-d'-1day'"+%Y%m%d"` #判断服务是否已经启动 ser=`/usr/bin/pgrepsendmail` if["$ser"!=""] then echo"theserviceisrunning" else /etc/init.d/sendmailstart fi #要发送的文件 file=/home/wlycle_uniq/data/send_head_data$time.info #收件人 array=(ex-hefeng600@pingan.com.cnaa@qq.com) foriin${array[@]};do mail-s"玉衡短信发送内容定时跟踪"$i-rdbc@notice.com<$file if[$?!=0];then echo"stepformailisfailed" exit0 fi done复制
Linux命令详解-SU命令 root权限下: 进入mike用户,环境不变/root root@Mikelucis:~#sumike mike@Mikelucis:/root$pwd /root 复制 进入mike用户,环境改变/home/mike root@Mikelucis:/home/mike#su-mike mike@Mikelucis:~$pwd /home/mike 复制 普通用户下: mike用户下,su无效无法切换到root用户下 mike@Mikelucis:~$su Password: su:Authenticationfailure//权限不足 mike@Mikelucis:~$ 复制 mike@Mikelucis:~$su- Password: su:Authenticationfailure//权限不足 mike@Mikelucis:~$ 复制 mike用户下,成功进入root用户(用sudo提升权限),环境不变/home/mike mike@Mikelucis:~$sudosu [sudo]passwordformike: root@Mi
rapidxml官网地址:http://rapidxml.sourceforge.net/ rapidxml只包含4个hpp头文件,把这四个头文件放到项目中,即可使用rapidxml #include<iostream> #include<string> #include<fstream> #include"rapidxml.hpp" #include"rapidxml_print.hpp" staticconstintbuf_len=1024; staticcharbuf[buf_len]={0};voidcreate(constchar*file_name) { rapidxml::xml_document<>doc; //声明 rapidxml::xml_node<>*declaration=doc.allocate_node(rapidxml::node_declaration); declaration->append_attribute(doc.allocate_attribute("version","