面向并发程序的重构一致性检测方法
发布时间:2022-02-04 20:32
针对并发软件重构后可能带来的行为不一致问题,提出了一种重构一致性检测方法,该方法使用控制流分析和数据流分析检测重构前后的变化,使用同步依赖分析检测重构前后同步依赖关系的变化.针对对象重用性、静态共享字段、死锁3种典型的引起并发错误的情况,设计了3种检测算法对重构前后程序的不一致性进行检测.依据该方法,在WALA软件分析框架下实现了一个原型检测工具.在实验中,使用该工具在SPECjbb2005和HSQLDB测试程序上进行了验证,并与Schafer等提出的方法进行比较,实验结果表明,该方法能够有效地发现并发软件重构的不一致行为.
【文章来源】:河北师范大学学报(自然科学版). 2020,44(03)
【文章页数】:9 页
【部分图文】:
检测框架
图3为对象重用检测算法.通过检测监视器对象的类型,对监视器对象类型进行判断,判断其是否为Boolean,Integer或String等类型.方法doPerformAnalysis(1~5行)中,被检测的程序如果检测的方法不为空,则通过调用方法populateBugInstances检测程序中符合条件的监视器对象信息,赋值给bugInstances实例获取最终符合条件的重用对象.方法populateBugInstances(6~12行)判断获取的指令是否为重用对象.其中获取的指令instruction必须为监视器获取锁定指令.通过调用方法getReusableLockObjectTypes给reusableLockObjectTypes赋值.该reusableLockObjectTypes符合对象重用类型.方法getReusableLockObjectTypes(13~18行),获取监视器指令monitorInstruction的指向地址,将其赋值给instanceKey.通过方法createReusableChecker判断instanceKey是否为重用对象类型.方法createReusableChecker(19~29行),获取instanceKey的类型,如果其类型为Boolean,Integer或String等重用类型,则检测出该程序中含有对象重用问题.2.2 静态共享字段检测
对象的重用是在锁定诸如Boolean,Integer等类型的对象时发生的重用,如Boolean类型只有2个值true和false,如果使用2个Boolean类型对象作为同步监视器对象,可能会因指向同一地址而导致问题.如图2的示例程序,在synchronized同步块中,其锁定监视器对象类型是Boolean类型.方法oneMethod( )和方法anotherMethod( )分别会在2个线程中执行.由于Boolean FALSE和false 2个常量代表同一内存位置,实际上是同一个同步对象,在图2的程序中虽然使用2个不同名字的同步对象,但会导致临界资源的访问形成互斥.图3为对象重用检测算法.通过检测监视器对象的类型,对监视器对象类型进行判断,判断其是否为Boolean,Integer或String等类型.方法doPerformAnalysis(1~5行)中,被检测的程序如果检测的方法不为空,则通过调用方法populateBugInstances检测程序中符合条件的监视器对象信息,赋值给bugInstances实例获取最终符合条件的重用对象.方法populateBugInstances(6~12行)判断获取的指令是否为重用对象.其中获取的指令instruction必须为监视器获取锁定指令.通过调用方法getReusableLockObjectTypes给reusableLockObjectTypes赋值.该reusableLockObjectTypes符合对象重用类型.方法getReusableLockObjectTypes(13~18行),获取监视器指令monitorInstruction的指向地址,将其赋值给instanceKey.通过方法createReusableChecker判断instanceKey是否为重用对象类型.方法createReusableChecker(19~29行),获取instanceKey的类型,如果其类型为Boolean,Integer或String等重用类型,则检测出该程序中含有对象重用问题.
本文编号:3613893
【文章来源】:河北师范大学学报(自然科学版). 2020,44(03)
【文章页数】:9 页
【部分图文】:
检测框架
图3为对象重用检测算法.通过检测监视器对象的类型,对监视器对象类型进行判断,判断其是否为Boolean,Integer或String等类型.方法doPerformAnalysis(1~5行)中,被检测的程序如果检测的方法不为空,则通过调用方法populateBugInstances检测程序中符合条件的监视器对象信息,赋值给bugInstances实例获取最终符合条件的重用对象.方法populateBugInstances(6~12行)判断获取的指令是否为重用对象.其中获取的指令instruction必须为监视器获取锁定指令.通过调用方法getReusableLockObjectTypes给reusableLockObjectTypes赋值.该reusableLockObjectTypes符合对象重用类型.方法getReusableLockObjectTypes(13~18行),获取监视器指令monitorInstruction的指向地址,将其赋值给instanceKey.通过方法createReusableChecker判断instanceKey是否为重用对象类型.方法createReusableChecker(19~29行),获取instanceKey的类型,如果其类型为Boolean,Integer或String等重用类型,则检测出该程序中含有对象重用问题.2.2 静态共享字段检测
对象的重用是在锁定诸如Boolean,Integer等类型的对象时发生的重用,如Boolean类型只有2个值true和false,如果使用2个Boolean类型对象作为同步监视器对象,可能会因指向同一地址而导致问题.如图2的示例程序,在synchronized同步块中,其锁定监视器对象类型是Boolean类型.方法oneMethod( )和方法anotherMethod( )分别会在2个线程中执行.由于Boolean FALSE和false 2个常量代表同一内存位置,实际上是同一个同步对象,在图2的程序中虽然使用2个不同名字的同步对象,但会导致临界资源的访问形成互斥.图3为对象重用检测算法.通过检测监视器对象的类型,对监视器对象类型进行判断,判断其是否为Boolean,Integer或String等类型.方法doPerformAnalysis(1~5行)中,被检测的程序如果检测的方法不为空,则通过调用方法populateBugInstances检测程序中符合条件的监视器对象信息,赋值给bugInstances实例获取最终符合条件的重用对象.方法populateBugInstances(6~12行)判断获取的指令是否为重用对象.其中获取的指令instruction必须为监视器获取锁定指令.通过调用方法getReusableLockObjectTypes给reusableLockObjectTypes赋值.该reusableLockObjectTypes符合对象重用类型.方法getReusableLockObjectTypes(13~18行),获取监视器指令monitorInstruction的指向地址,将其赋值给instanceKey.通过方法createReusableChecker判断instanceKey是否为重用对象类型.方法createReusableChecker(19~29行),获取instanceKey的类型,如果其类型为Boolean,Integer或String等重用类型,则检测出该程序中含有对象重用问题.
本文编号:3613893
本文链接:https://www.wllwen.com/kejilunwen/jisuanjikexuelunwen/3613893.html