CN106528179A - 一种Java类依赖关系的静态识别方法 - Google Patents

一种Java类依赖关系的静态识别方法 Download PDF

Info

Publication number
CN106528179A
CN106528179A CN201611121526.0A CN201611121526A CN106528179A CN 106528179 A CN106528179 A CN 106528179A CN 201611121526 A CN201611121526 A CN 201611121526A CN 106528179 A CN106528179 A CN 106528179A
Authority
CN
China
Prior art keywords
dependence
attribute
static
instruction
persistence
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201611121526.0A
Other languages
English (en)
Other versions
CN106528179B (zh
Inventor
王帅
杨燕
徐良
田申
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Institute of Software of CAS
Original Assignee
Institute of Software of CAS
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Institute of Software of CAS filed Critical Institute of Software of CAS
Priority to CN201611121526.0A priority Critical patent/CN106528179B/zh
Publication of CN106528179A publication Critical patent/CN106528179A/zh
Application granted granted Critical
Publication of CN106528179B publication Critical patent/CN106528179B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • G06F8/24Object-oriented
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种Java类依赖关系的静态识别方法,包括:1)对基于Java开发的Web应用的代码文件展开静态分析,构建代码中方法、变量和属性之间的依赖关系图;2)基于依赖关系图,自动识别Web应用中存在读写共享的持久化属性。本发明为自动检测Web应用是否可以集群部署提供了静态分析方法,可以覆盖待检测Web应用中所有可能的执行路径,并且不会引入任何代码污染。

Description

一种Java类依赖关系的静态识别方法
技术领域
本发明涉及一种Java类依赖关系的静态识别方法,可以针对用户提供的基于Java的Web应用,通过静态代码分析,快速地构建出所有类、字段之间的依赖关系,并从中自动识别存在读写共享的持久化属性,这在自动检测Web应用是否可以集群部署,以及Web应用的集群迁移方面具有重要作用,属于软件应用技术领域。
背景技术
为了满足不断增长的海量信息以及数据处理的需求,计算机集群技术应运而生。集群技术通过将多台计算机连接在一起,按照一定的规则进行协同工作来完成单台计算机无法完成的任务。通过集群,可以以较低的成本搭建拥有强大计算能力的系统,并且其性能、扩展性和可用性都得以大大增强。集群对象的共享是集群技术中的一个关键问题——所谓集群对象,就是那些虽然物理上分布于不同的机器,但是逻辑上具有同一性的那些对象,在集群外部看来它们表示同一个对象。由于集群对象维护的是集群中不同服务器之间的协同工作的数据,它们的正确共享是业务逻辑正常运行的重要保证。
针对Java系统,在集群的搭建过程中,为了使普通的Java对象成为集群对象,实现集群对象的正确共享,需要针对所有共享的Java类进行存取方式上的重构,即,将单机式的数据读写方式转换成集群式的数据读写方式。如果某个共享属性没有被正确地重构,那么它便无法拥有集群的行为。这意味着要从所有的Java类中定位存在读写共享的持久化属性。
在Java系统中,动态分析,或运行时分析,可以在一定程度上解决共享属性的搜索和推导问题。然而在动态分析中,系统的运行必须要覆盖所有可能的代码路径——包括正常情况和异常情况,否则便无法保证找出的共享属性的集合的完备性,这就相当于要进行一次完备的软件测试,难度相对较大。并且,为了获取某个Java对象属性的引用和依赖信息,需要在原系统代码中插入Java反射机制的代码,这无疑给原系统带来了不少的代码污染,这些源代码污染带来了一定的重构风险。
因此,为了更加方便、快捷、高效、完备地进行集群对象共享的配置,需要一种Java类依赖关系的静态识别方法,该方法可以覆盖所有的执行路径,并且避免代码污染。
发明内容
本发明的目的在于克服现有技术中存在的问题,提供一种Java类依赖关系的静态识别方法,该方法利用静态程序分析技术对用户指定的Web应用中包含的全部代码进行分析,可以覆盖所有的执行路径,并且分析过程中无须对原始代码进行插装,从而不会对原系统造成任何代码污染。
本发明适用于自动检测Web应用是否可以集群部署,并可用于指导开发人员对Web应用进行集群迁移,可以提高Web应用集群迁移的整体效率。
为了实现本发明的目的,采用的技术方案概述如下:
一种基于静态程序分析的共享持久化属性识别方法,如图1所示,包括以下步骤:
步骤1:分析用户指定的目标Web应用的代码,从中识别目标Web应用的入口方法,并将识别得到的入口方法置入待分析方法集合中;
步骤2:依次分析待分析方法集合中的每个入口方法,建立入口方法内部定义的变量、引用的属性和被调用的方法间的依赖关系,得到入口方法内部的依赖关系图;并利用相同的步骤对入口方法调用的其他方法进行分析;分析完成后,将所有被分析的被调用方法置如已分析方法集合中;
步骤3:依次分析已分析方法集合中的每个被调用方法,对于被调用方法的每次调用,建立方法调用时传入的实际参数和被调用方法定义的形式参数间的依赖关系,从而得到完整的依赖关系图;
步骤4:遍历步骤3得到的依赖关系图,从中搜索持久化结点,并将其对应的元素置于持久化元素集合中;持久化元素指在Java中被声明为静态的属性、变量或方法,但在依赖关系图中被非静态的属性、变量或方法依赖的元素;
步骤5:依次以步骤4得到的持久化元素集合中的元素为起点,对步骤3得到的依赖关系图进行遍历,位于2个持久化元素之间的属性即被识别为持久化属性,将识别得到的持久化属性置于持久化属性集合中,并最终输出。
所述步骤1中,由用户提供目标Web应用程序源码,初始化待分析方法集合Su为空;遍历程序源码,从中识别系统的入口方法,入口方法包括所有实现了标准Servlet接口的Java类中的doGet、doPost方法,并将这些方法置入待分析方法集合Su中。
所述步骤2具体包括以下步骤,
(1)初始化已分析方法集合Sa为空;
(2)从待分析方法集合Su中取出一个方法M,
(2.1)如果方法M不是静态方法,即M没有被声明为stat ic的,则按照如下规则依次对方法包含的每条指令进行分析:
o)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;
p)如果当前指令是静态属性读指令,操作属性为P,则添加依赖关系M依赖于P,并设置P为持久化元素;
q)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;
r)如果当前指令是静态属性写指令,操作属性为P,则添加依赖关系P依赖于M,并设置P为持久化元素;
s)如果当前指令是赋值指令,一侧操作元素为变量L,另一侧操作元素集合为Rs,且Rs中包括静态属性集合Rsp,则添加依赖关系L依赖于Rs,L依赖于M,并设置Rsp中元素为持久化元素;
t)如果当前指令是返回指令,返回元素为R,R是非静态属性或变量,则添加依赖关系M依赖于R;
u)如果当前指令是返回指令,返回元素为R,R是静态属性,则添加依赖关系M依赖于R,并设置R为持久化元素;
v)如果当前指令是方法调用指令,被调用的方法N是非静态方法,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;
w)如果当前指令是方法调用指令,被调用的方法N是静态方法,则添加依赖关系M静态依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sn中,并设置N为持久化元素;
(2.2)如果方法M是静态方法,则按照如下规则依次对方法包含的每条指令进行分析:
x)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;
y)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;
z)如果当前指令是赋值指令,一侧操作元素为变量L,另一侧操作元素集合为Rs,则添加依赖关系L依赖于Rs,L依赖于M;
aa)如果当前指令是返回指令,返回元素为R,则添加依赖关系M依赖于R;
bb)如果当前指令是方法调用指令,被调用的方法为N,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;
(3)将方法M置入已分析方法集合Sa中;
(4)返回步骤(2)继续处理Su,直到Su为空。
所述步骤3具体包括以下步骤:
(1)从已分析方法集合Sa中取出一个方法M;
(2)获取M的调用集合Sc;
(3)从调用集合Sc中取出一次调用指令C;
(4)建立调用指令C中传入的实际参数和方法M定义的形式参数间的依赖关系,对于调用指令C中的每个实际参数A,找出其对应的形式参数P;如果A是对象的静态属性,则添加依赖关系P静态依赖于A,否则添加依赖关系P依赖于A;
(5)返回步骤(3)继续处理Sc,直到集合Sc为空;
(6)返回步骤(1)继续处理Sa,直到集合Sa为空。
所述步骤4具体包括以下步骤:
(1)初始化持久化结点集合Ns为空;
(2)获取步骤3构建的属性依赖图中的结点集合Ne;
(3)从结点集合Ne中取出一个结点n,如果n是持久化结点,则将n置入持久化结点集合Ns中;
(4)返回步骤(3)继续处理Ne,直到集合Ne为空。
所述步骤5具体包括以下步骤:
(1)初始化输出属性集合S为空;
(2)从步骤4得到的持久化结点集合Ns中取出一条结点n1;
(3)以n1为起点,对依赖图进行无重复结点的深度遍历,直到遇到下一个持久化结点n2或没有下一个无重复结点;当遇到持久化结点n2时,则将n1与n2之间的属性结点置入输出属性集合S中;
(4)返回步骤(2)继续处理Ns,直到Ns为空;
(5)输出最终结果S。
与现有的技术相比较,本发明具有如下的优势:
(1)本发明完全依靠静态代码分析技术实现,分析过程覆盖原始Web应用的所有代码,因此可以覆盖所有可能的执行路径;
(2)本发明的分析过程无须对原始代码进行插装,因此避免了运行时分析引入的代码污染。
附图说明
图1为本发明方法在实施例中的实现的总体流程图;
图2为本发明步骤2的实现过程图;
图3为本发明步骤3的实现过程图;
图4为本发明步骤5的实现过程图;
图5为本发明方法在实施例中构造的依赖关系图。
具体实施方式
如图1所示,本发明一种基于静态程序分析的共享持久化属性识别方法,其输入为一个基于Java的Web应用的字节码文件,输出为可能存在共享的持久化属性集合,包括以下步骤:
步骤1:从用户指定的目标Web应用中识别入口方法集合,记为Su;
步骤2:依次分析每个入口方法和入口方法直接或间接调用的其他方法,为每个入口方法和被调用的方法构建方法内部的依赖关系图;并将完成分析的被调用方法置入已分析方法集合中,记为Sa;同时记录每个被调用方法被调用时的调用信息,置入该方法的调用集合中,记为Sc;
步骤3:根据每个被调用方法的调用信息构建方法调用时传入的实际参数和被调用方法定义的形式参数之间的依赖关系,从而构建完整的依赖关系图;
步骤4:从完整的依赖关系图中识别持久化元素集合,记为Ns;
步骤5:基于持久化元素,从依赖关系图中识别持久化属性集合,记为S。
此处的属性依赖关系用以描述Java语言的三种元素,即对象中的方法、属性和变量,之间的依赖关系。
如果元素A的功能的正常运行需要元素B的服务的保证,则称元素A依赖于元素B(记作A->B)。本方法定义这两种语言元素应有如下的四种依赖关系:
1.方法对方法的依赖:假如方法A调用了方法B,则定义方法A依赖于方法B,同时方法B依赖于方法A。
2.方法对属性或变量的依赖:假如方法A的返回值是一个属性或变量B,则定义方法A依赖于属性或变量B。
3.属性或变量对方法的依赖:假如方法A中存在一条赋值语句,等号左边是属性或变量B,则定义属性或变量B依赖于方法A;如果等号右边是一个方法调用C,则同时定义属性或变量B依赖于方法C。
4.属性或变量对属性或变量的依赖:假如方法A中存在一条赋值语句,等号左边是属性或变量B,并且等号右边是另一个属性或变量C,则定义属性或变量B依赖于属性或变量C。
基于以上定义,所述步骤1具体包括以下步骤:
(1)由用户提供目标Web应用程序源码,并初始化待分析方法集合Su为空;
(2)遍历程序源码,从中识别系统的入口方法,例如所有实现了标准Servlet等接口的Java类中的doGet、doPost等方法,并将这些方法置入待分析方法集合Su中。
步骤2具体包括以下步骤,如图2所示:
(1)初始化已分析方法集合Sa为空;
(2)从待分析方法集合Su中取出一个方法M,
(2.1)如果方法M不是静态方法,即M没有被声明为static的,则按照如下规则依次对方法包含的每条指令进行分析:
a)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;
b)如果当前指令是静态属性读指令,操作属性为P,则添加依赖关系M依赖于P,并设置P为持久化元素;
c)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;
d)如果当前指令是静态属性写指令,操作属性为P,则添加依赖关系P依赖于M,并设置P为持久化元素;
e)如果当前指令是赋值指令,左侧操作元素为变量L,右侧操作元素集合为Rs,且Rs中包括静态属性集合Rsp,则添加依赖关系L依赖于Rs,L依赖于M,并设置Rsp中元素为持久化元素;
f)如果当前指令是返回指令,返回元素为R,R是非静态属性或变量,则添加依赖关系M依赖于R;
g)如果当前指令是返回指令,返回元素为R,R是静态属性,则添加依赖关系M依赖于R,并设置R为持久化元素;
h)如果当前指令是方法调用指令,被调用的方法N是非静态方法,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;
i)如果当前指令是方法调用指令,被调用的方法N是静态方法,则添加依赖关系M静态依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sn中,并设置N为持久化元素;
(2.2)如果方法M是静态方法,则按照如下规则依次对方法包含的每条指令进行分析:
j)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;
k)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;
l)如果当前指令是赋值指令,左侧操作元素为变量L,右侧操作元素集合为Rs,则添加依赖关系L依赖于Rs,L依赖于M;
m)如果当前指令是返回指令,返回元素为R,则添加依赖关系M依赖于R;
n)如果当前指令是方法调用指令,被调用的方法为N,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;
(3)将方法M置入已分析方法集合Sa中;
(4)返回2继续处理Su,直到Su为空。
步骤3具体包括以下步骤,如图3所示:
(1)从全部方法集合Sa中取出一个方法M;
(2)获取M的调用集合Sc;
(3)从调用集合Sc中取出一次调用指令C;
(4)建立调用指令C中传入的实际参数和方法M定义的形式参数间的依赖关系,对于调用指令C中的每个实际参数A,找出其对应的形式参数P;如果A是对象的静态属性,则添加依赖关系P静态依赖于A,否则添加依赖关系P依赖于A;
(5)返回步骤(3)继续处理Sc,直到集合Sc为空;
(6)返回步骤(1)继续处理Sa,直到集合Sa为空。
步骤4具体包括以下步骤:
(1)初始化持久化结点集合Ns为空;
(2)获取步骤3构建的属性依赖图中的结点集合Ne;
(3)从结点集合Ne中取出一个结点n,如果n是持久化结点,则将n置入持久化结点集合Ns中;
(4)返回(3)继续处理Ne,直到集合Ne为空。
步骤5具体包括以下步骤,如图4所示:
(1)初始化输出属性集合S为空;
(2)从步骤4得到的持久化结点集合Ns中取出一条结点n1;
(3)以n1为起点,对依赖图进行无重复结点的深度遍历,直到遇到下一个持久化结点n2或没有下一个无重复结点;当遇到持久化结点n2时,则将n1与n2之间的属性结点置入输出属性集合S中;
(4)返回步骤(2)继续处理Ns,直到Ns为空;
(5)输出最终结果S。
下面结合具体实施例对本发明进行详细描述。以一段简单的代码作为待测程序为例,说明本发明的工作流程,如下:
其中,ExampleServlet是Web应用的入口,其作用是显示当前应用的访问计数;CountFilter是请求拦截器,对该应用的每次请求都会使计数器加一;Counter是计数器,用以保存计数器的取值。具体Java语言描述如下:
本发明方法的具体实施过程如下,如图1所示:
1初始化,设置待分析方法集合Su={},全部方法集合Sa={},共享持久化属性集合Sr={};
2从源代码中识别应用入口方法,并将其放入待分析方向集合Su中;本实施例中的入口函数为集成了javax.servlet.HttpServlet类的ExampleServlet的doGet方法和实现了javax.servlet.Filter接口的CountFilter的doFilter方法,本步结果为,Su={ExampleServlet.doGet,CountFilter.doFilter};
3依次对待分析方法集合Su中的方法进行分析,分析过程为:
3.1分析ExampleServlet.doGet方法,指令:
int count=Counter.getCount();
根据4.1中的规则f,ExampleServlet.doGet.count依赖于Counter.getCount,且Counter.getCount为持久化元素;
根据4.1中的规则j,ExampleServlet.doGet依赖于Counter.getCount,且Counter.getCount为持久化元素,修改Su={CounterFileter.doFilter,Counter.getCount};
修改Sa={ExampleServlet.doGet};
3.2分析CounterFilter.doFilter方法,指令:
Counter.increase();
根据4.1中的规则j,CounterFilter.doFilter依赖于Counter.increase,且Counter.increase为持久化元素,修改Su={Counter.getCount,Counter.increase};
修改Sa={ExampleServlet.doGet,CounterFilter.doFilter};
3.3分析Counter.getCount方法,指令:
return count;
根据4.2中的规则n,Counter.getCount方法依赖于Counter.count,修改Su={Counter.increase};
修改Sa={ExampleServlet.doGet,CounterFilter.doFilter,Counter.getCount};
3.4分析Counter.increase方法,指令:
count++;
根据4.2中的规则m,Counter.count依赖于Counter.increase,修改Su={};
修改Sa={ExampleServlet.doGet,CounterFilter.doFilter,Counter.getCount,Counter.increase};
4构建函数调用时实际参数与形式参数间的依赖关系,依次对Sa中的方法进行分析,得到依赖关系图,如图5所示,具体分析过程为:
4.1分析ExampleServlet.doGet,没有被调用,无须额外处理,修改Sa={CounterFilter.doFilter,Counter.getCount,Counter.increase};
4.2分析CounterFilter.doFilter,没有被调用,无须额外处理,修改Sa={Counter.getCount,Counter.increase};
4.3分析Counter.getCount,被ExampleServlet.doGet调用,但没有传入参数,无须额外处理,修改Sa={Counter.increase};
4.4分析Counter.increase,被CountFilter.doFilter调用,但没有传入参数,无须额外处理,修改Sa={};
5遍历得到的依赖关系图,获取所有持久化元素集合Se={Counter.getCount,Counter.increase};
6以持久化元素集合Se中的结点为起点,对依赖关系图进行遍历,并对遍历得到的路径进行分析:
6.1对于结点Counter.getCount,遍历得到路径Counter.getCount->Counter.count->Counter.increase,遍历该条路径,得到其中的属性结点Counter.count,并将其置于共享持久化属性集合Sr中,即Sr={Counter.count};
6.2对于结点Counter.increase,遍历无法得到从Counter.increase触发的路径;
7分析完成,得到最终结果Sr={Counter.count}。
提供以上实施例仅仅是为了描述本发明的目的,而并非要限制本发明的范围。本发明的范围由所附权利要求限定。不脱离本发明的精神和原理而做出的各种等同替换和修改,均应涵盖在本发明的范围之内。

Claims (6)

1.一种Java类依赖关系的静态识别方法,其特征在于包括以下步骤:
步骤1:分析用户指定的目标Web应用的代码,从中识别目标Web应用的入口方法,并将识别得到的入口方法置入待分析方法集合中;
步骤2:依次分析待分析方法集合中的每个入口方法,建立入口方法内部定义的变量、引用的属性和被调用的方法间的依赖关系,得到入口方法内部的依赖关系图;并利用相同的步骤对入口方法调用的其他方法进行分析;分析完成后,将所有被分析的被调用方法置如已分析方法集合中;
步骤3:依次分析已分析方法集合中的每个被调用方法,对于被调用方法的每次调用,建立方法调用时传入的实际参数和被调用方法定义的形式参数间的依赖关系,从而得到完整的依赖关系图;
步骤4:遍历步骤3得到的依赖关系图,从中搜索持久化结点,并将其对应的元素置于持久化元素集合中;持久化元素指在Java中被声明为静态的属性、变量或方法,但在依赖关系图中被非静态的属性、变量或方法依赖的元素;
步骤5:依次以步骤4得到的持久化元素集合中的元素为起点,对步骤3得到的依赖关系图进行遍历,位于2个持久化元素之间的属性即被识别为持久化属性,将识别得到的持久化属性置于持久化属性集合中,并最终输出。
2.根据权利要求1所述的一种Java类依赖关系的静态识别方法,其特征在于:所述步骤1中,由用户提供目标Web应用程序源码,初始化待分析方法集合Su为空;遍历程序源码,从中识别系统的入口方法,入口方法包括所有实现了标准Servlet接口的Java类中的doGet、doPost方法,并将这些方法置入待分析方法集合Su中。
3.根据权利要求1所述的一种Java类依赖关系的静态识别方法,其特征在于:所述步骤2具体包括以下步骤,
(1)初始化已分析方法集合Sa为空;
(2)从待分析方法集合Su中取出一个方法M,
(2.1)如果方法M不是静态方法,即M没有被声明为static的,则按照如下规则依次对方法包含的每条指令进行分析:
a)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;
b)如果当前指令是静态属性读指令,操作属性为P,则添加依赖关系M依赖于P,并设置P为持久化元素;
c)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;
d)如果当前指令是静态属性写指令,操作属性为P,则添加依赖关系P依赖于M,并设置P为持久化元素;
e)如果当前指令是赋值指令,一侧操作元素为变量L,另一侧操作元素集合为Rs,且Rs中包括静态属性集合Rsp,则添加依赖关系L依赖于Rs,L依赖于M,并设置Rsp中元素为持久化元素;
f)如果当前指令是返回指令,返回元素为R,R是非静态属性或变量,则添加依赖关系M依赖于R;
g)如果当前指令是返回指令,返回元素为R,R是静态属性,则添加依赖关系M依赖于R,并设置R为持久化元素;
h)如果当前指令是方法调用指令,被调用的方法N是非静态方法,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;
i)如果当前指令是方法调用指令,被调用的方法N是静态方法,则添加依赖关系M静态依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sn中,并设置N为持久化元素;
(2.2)如果方法M是静态方法,则按照如下规则依次对方法包含的每条指令进行分析:
j)如果当前指令是属性读指令,操作属性为P,则添加依赖关系M依赖于P;
k)如果当前指令是属性写指令,操作属性为P,则添加依赖关系P依赖于M;
l)如果当前指令是赋值指令,一侧操作元素为变量L,另一侧操作元素集合为Rs,则添加依赖关系L依赖于Rs,L依赖于M;
m)如果当前指令是返回指令,返回元素为R,则添加依赖关系M依赖于R;
n)如果当前指令是方法调用指令,被调用的方法为N,则添加依赖关系M依赖于N,并将方法N至于待分析方法集合Su中,同时将该条调用指令置入方法N的调用集合Sc中;
(3)将方法M置入已分析方法集合Sa中;
(4)返回步骤(2)继续处理Su,直到Su为空。
4.根据权利要求1所述的一种Java类依赖关系的静态识别方法,其特征在于:所述步骤3具体包括以下步骤:
(1)从已分析方法集合Sa中取出一个方法M;
(2)获取M的调用集合Sc;
(3)从调用集合Sc中取出一次调用指令C;
(4)建立调用指令C中传入的实际参数和方法M定义的形式参数间的依赖关系,对于调用指令C中的每个实际参数A,找出其对应的形式参数P;如果A是对象的静态属性,则添加依赖关系P静态依赖于A,否则添加依赖关系P依赖于A;
(5)返回步骤(3)继续处理Sc,直到集合Sc为空;
(6)返回步骤(1)继续处理Sa,直到集合Sa为空。
5.根据权利要求1所述的一种Java类依赖关系的静态识别方法,其特征在于:所述步骤4具体包括以下步骤:
(1)初始化持久化结点集合Ns为空;
(2)获取构建的属性依赖图中的结点集合Ne;
(3)从结点集合Ne中取出一个结点n,如果n是持久化结点,则将n置入持久化结点集合Ns中;
(4)返回步骤(3)继续处理Ne,直到集合Ne为空。
6.根据权利要求1所述的一种Java类依赖关系的静态识别方法,其特征在于:所述步骤5具体包括以下步骤:
(1)初始化输出属性集合S为空;
(2)从得到的持久化结点集合Ns中取出一条结点n1;
(3)以n1为起点,对依赖图进行无重复结点的深度遍历,直到遇到下一个持久化结点n2或没有下一个无重复结点;当遇到持久化结点n2时,则将n1与n2之间的属性结点置入输出属性集合S中;
(4)返回步骤(2)继续处理Ns,直到Ns为空;
(5)输出最终结果S。
CN201611121526.0A 2016-12-08 2016-12-08 一种Java类依赖关系的静态识别方法 Active CN106528179B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611121526.0A CN106528179B (zh) 2016-12-08 2016-12-08 一种Java类依赖关系的静态识别方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611121526.0A CN106528179B (zh) 2016-12-08 2016-12-08 一种Java类依赖关系的静态识别方法

Publications (2)

Publication Number Publication Date
CN106528179A true CN106528179A (zh) 2017-03-22
CN106528179B CN106528179B (zh) 2019-06-21

Family

ID=58342193

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611121526.0A Active CN106528179B (zh) 2016-12-08 2016-12-08 一种Java类依赖关系的静态识别方法

Country Status (1)

Country Link
CN (1) CN106528179B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109739526A (zh) * 2017-10-30 2019-05-10 北京京东尚科信息技术有限公司 代码更新方法和装置
CN111817916A (zh) * 2020-07-02 2020-10-23 浙江同花顺智能科技有限公司 基于移动终端集群的测试方法、装置、设备和存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102736980A (zh) * 2012-06-29 2012-10-17 南京大学 一种面向Java程序的随机测试用例生成方法
CN105786715A (zh) * 2016-04-08 2016-07-20 南京大学 一种程序静态自动分析方法
CN106020848A (zh) * 2016-06-07 2016-10-12 北京信息科技大学 面向c#的函数调用路径生成方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102736980A (zh) * 2012-06-29 2012-10-17 南京大学 一种面向Java程序的随机测试用例生成方法
CN105786715A (zh) * 2016-04-08 2016-07-20 南京大学 一种程序静态自动分析方法
CN106020848A (zh) * 2016-06-07 2016-10-12 北京信息科技大学 面向c#的函数调用路径生成方法

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109739526A (zh) * 2017-10-30 2019-05-10 北京京东尚科信息技术有限公司 代码更新方法和装置
CN111817916A (zh) * 2020-07-02 2020-10-23 浙江同花顺智能科技有限公司 基于移动终端集群的测试方法、装置、设备和存储介质
CN111817916B (zh) * 2020-07-02 2022-06-03 浙江同花顺智能科技有限公司 基于移动终端集群的测试方法、装置、设备和存储介质

Also Published As

Publication number Publication date
CN106528179B (zh) 2019-06-21

Similar Documents

Publication Publication Date Title
US8010844B2 (en) File mutation method and system using file section information and mutation rules
CN109033843B (zh) 用于分布式静态检测系统的Java文件依赖性分析方法及模块
CA3060085A1 (en) Method for determining defects and vulnerabilities in software code
US10354031B2 (en) Information processing by interpenetrating signal transmission channel in design for testability of chip
CN104834603A (zh) 一种面向回归测试的控制流变更影响域分析方法和系统
US10514898B2 (en) Method and system to develop, deploy, test, and manage platform-independent software
CN107015904B (zh) 堆栈的保护方法及装置
CN109388573B (zh) 一种无漏报的中断驱动型程序运行时错误检测方法和系统
CN111124870A (zh) 一种接口测试方法及装置
CN107579851A (zh) 确定资源编排模板的执行顺序的方法和装置
CN107622017B (zh) 一种通用自动化软件测试的解析方法
CN108897678B (zh) 静态代码检测方法和静态代码检测系统、存储设备
CN106528179A (zh) 一种Java类依赖关系的静态识别方法
CN111260336A (zh) 基于规则引擎的业务核对方法、装置及设备
US20140089738A1 (en) System and method for identifying source of run-time execution failure
US20140137083A1 (en) Instrumenting computer program code by merging template and target code methods
Waheed et al. Data flow based test case generation algorithm for object oriented integration testing
CN113805861B (zh) 基于机器学习的代码生成方法、代码编辑系统及存储介质
CN106155880A (zh) 一种基于策略的自动化程序分析系统和方法
CN113946516A (zh) 代码覆盖率确定方法、装置及存储介质
CN103577170A (zh) 网络应用的构建方法及装置
CN112463596A (zh) 测试用例数据的处理方法、装置、设备以及处理设备
CN106681910B (zh) 一种基于主机代码解析生成测试案例的方法及装置
CN110321130A (zh) 基于系统调用日志的不可重复编译定位方法
CN112015633A (zh) 测试激励多平台复用方法、装置、设备及存储介质

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant