CN109033843A - 用于分布式静态检测系统的Java文件依赖性分析方法及模块 - Google Patents
用于分布式静态检测系统的Java文件依赖性分析方法及模块 Download PDFInfo
- Publication number
- CN109033843A CN109033843A CN201810869157.6A CN201810869157A CN109033843A CN 109033843 A CN109033843 A CN 109033843A CN 201810869157 A CN201810869157 A CN 201810869157A CN 109033843 A CN109033843 A CN 109033843A
- Authority
- CN
- China
- Prior art keywords
- class
- file
- java
- document
- analysis
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种用于分布式静态检测系统的Java文件依赖性分析方法及模块,其方法包括以下步骤:针对程序包中的所有文件进行信息处理;读取所有文件中的一个Java源代码文件;生成该文件的抽象语法树;对该文件所有语句进行依赖性分析,找出该文件依赖的其他文件;记录该文件与其他文件的依赖关系;判断所有文件是否已依赖性分析完毕;根据所有文件的依赖关系,生成该程序包的依赖性关系图;根据该依赖性关系图进行分析,得到所有不可再分的独立文件集合;根据分布式检测系统对程序检测包的要求,对所有不可再分的独立文件集合进行合并;对程序包进行解耦拆分,得到程序包解耦拆分的结果。本发明的有益效果:实现单任务多节点多进程检测。
Description
技术领域
本发明涉及一种文件依赖性分析方法,特别是涉及一种用于分布式静态检测系统的Java文件依赖性分析方法及模块,属于计算机软件静态检测技术。
背景技术
随着软件行业不断发展,软件项目也日益庞大,要使复杂的软件项目在运行中不出错,就要对软件项目质量进行严格把关。计算机软件归根结底都是程序代码,如果程序代码中存在安全漏洞,那其他的安全策略则无从谈起,所以计算机软件代码安全是整个计算机系统安全的基石。源代码的安全漏洞检测则是保证软件安全最强有力的措施之一。源代码安全漏洞检测主要分为动态分析方法和静态分析方法。动态分析方法需要运行被测程序,其检测依赖外部环境和测试用例,具有一定的不确定性。静态分析方法主要对源代码进行分析,能发现较多的潜在安全漏洞,能避免动态检测的不足。
关于静态检测技术,例如现阶段已有的开源工具诸如Findbugs、PMD等,或者商用软件Fortify SCA、Klocwork,都是针对单个程序单机运行的。现阶段的分布式检测系统,仍然都是单个检测任务部署到单个节点,使用检测工具单进程进行检测,所以单个任务并不支持多节点多进程的分布式部署检测。现阶段的分布式检测系统,存在的主要问题是:单一任务单进程运行检测,导致检测消耗的时间随着任务规模增大而增加,系统级程序检测时长甚至可长达数十小时。
如图1所示的基于依赖性分析的分布式静态检测系统就是为了解决现阶段分布式检测系统存在的问题而提出的。该系统针对单任务进行程序代码分包后再进行多节点部署的分布式检测,达到缩短程序检测时间目的。而系统的前端分析模块——依赖性分析模块的分析结果的准确性是保证缩短检测时间却不影响检测结果的重要前提。
因此,本发明就是为了实现图1所示的分布式静态检测系统提到的系统的前端分析模块,建立基于Java抽象语法树上的文件依赖性分析模型,使之能够适用于单任务多节点运行的分布式静态检测系统。
发明内容
本发明的主要目的在于,克服现有技术中的不足,提供一种用于分布式静态检测系统的Java文件依赖性分析方法及模块,克服目前分布式检测系统中已使用的检测方法仍然是检测任务单任务单节点单进程运行所存在的不足,提供针对任务包解耦再分包的方法,实现单任务多节点多进程运行,具有产业上的利用价值。
为了达到上述目的,本发明所采用的技术方案是:
一种用于分布式静态检测系统的Java文件依赖性分析方法,包括以下步骤:
1)针对程序包中的所有文件进行信息处理,记录Java源代码文件为待分析对象;
2)读取所有文件中的一个Java源代码文件;
3)生成该文件的抽象语法树;
4)基于该文件的抽象语法树,对该文件所有语句进行依赖性分析,找出该文件依赖的其他文件;
5)记录该文件与其他文件的依赖关系;
其中,该文件与其他文件的依赖关系使用有向图记录;
6)判断程序包中的所有文件是否已依赖性分析完毕;
若已依赖性分析完毕、则执行下一步,若否、则跳转执行步骤2);
7)根据程序包中的所有文件的依赖关系,生成该程序包的依赖性关系图;
根据该依赖性关系图进行分析,得到所有不可再分的独立文件集合;
8)根据分布式检测系统对程序检测包的要求,对所有不可再分的独立文件集合进行合并,得到若干个符合系统需求的相互独立的Java源代码文件集合;
9)根据Java源代码文件集合,对程序包进行解耦拆分,获取所有程序子包,从而得到程序包解耦拆分的结果。;
本发明进一步设置为:所述步骤1)中的信息处理,具体为,对程序包中的Java源代码文件和该Java源代码文件依赖的jar包进行分类处理;其中,Java源代码文件被视为待分析对象,依赖的jar包则作为依赖项引入分析过程。
本发明进一步设置为:所述步骤3)生成该文件的抽象语法树,具体为,使用JavaParser对待分析对象Java源代码文件以特定结构生成抽象语法树;
其中,生成的抽象语法树包括三大类节点,分别是声明节点、表达式节点和块节点;
所述声明节点,用于记录文本中与声明有关的语句或块,包括Package声明、import声明、类声明、方法声明和变量声明;
所述表达式节点,用于记录一切除了声明节点以及块节点的语句,包括方法调用语句、类创建语句和赋值语句;
所述块节点,用于表示带有花括号{}中的语句,包括类声明的类内容、方法声明中的方法内容、if语句、try语句、catch语句和for语句。
本发明进一步设置为:所述步骤4)中的依赖性分析,具体包括以下步骤:
4-1)Package声明以及import声明分析;
首先,分析文件所在的Package以及Import的Package,得到本文件所依赖的Package;
然后,直接遍历依赖的Package中的类以及Import的类,得到该文件所有可能依赖的类,以缩小下一步分析中类遍历范围;
最后,记录Import Static引入的静态变量;
4-2)类声明分析;
针对该文件的public类以及文件的内部类进行分析,若public类以及文件的内部类存在父类或者实现的接口类,则将找到的父类以及实现的接口类记录下来;
4-3)变量声明分析;
分析所有变量声明语句,记录所有是类对象变量所属的类,若这些类对象变量同时初始化,同时检查初始化的值是否是类的静态成员变量,若是、则记录下该成员变量所属的类;
4-4)方法声明分析;
分析方法声明中的返回类型、输入参数类型以及抛出错误类型;
若方法返回类型非void或者非Java基本类型,则记录下方法返回类型所属的类;
若方法声明存在大于等于一个输入参数,则依次分析每个输入参数,记录下每个非Java基本类型输入参数所属的类;
若方法存在抛出错误,记录下方法所有抛出错误所属的类;
4-5)特定语句分析;
遍历所感兴趣的特定语句,记录特定语句中存在的类或者类的静态成员;
其中,特定语句是指可能存在类符号的语句,包括赋值语句、类创建语句、for语句和catch语句;
4-6)方法调用分析;
分析方法调用的输入参数,若方法调用存在大于等于一个输入参数,则依次分析每个输入参数,记录下每个非Java基本类型输入参数所属的类;
分析该方法调用是否是静态成员方法,若是,则记录下该调用方法所属的类;若否,则查询该调用方法是否属于该文件public类或者内部类,若属于,则忽略该调用方法所属于的类;若不属于,则查询并记录下该调用方法所属的外部类;
4-7)注解分析;
分析文件中的注解,若存在自定义注解,则把该注解所属的自定义注解类记录下来;
4-8)搜索依赖类所在文件;
搜索定位根据步骤4-1)至步骤4-7)中所得到的依赖类所在的文件;
其中,包含依赖类的jar包为该文件所依赖的jar包,包含依赖类的Java源代码文件为该文件所依赖的Java源代码文件。
本发明进一步设置为:所述步骤7)中的生成该程序包的依赖性关系图,具体是,将所有文件的依赖关系进行合并,生成程序包所有文件之间的总的依赖关系图;
其中,该依赖关系图是一张存在无入边顶点的有环有向图。
本发明进一步设置为:所述步骤7)中的得到所有不可再分的独立文件集合,具体是,从依赖关系图中的所有无入边顶点出发向下分析,得到所有不依赖于其他图的子图;
其中,每个子图中的全部节点都是一个不可再分文件的集合。
本发明进一步设置为:所述步骤8)中的对所有不可再分的独立文件集合进行合并,具体是,根据分布式检测系统所需求的文件包大小,在不超过系统要求大小之内,遵循合并规则,对所有不可再分的独立文件集合进行合并,得到若干个符合系统需求的相互独立的Java源代码文件集合;
其中,合并规则包括第一规则和第二规则;所述第一规则为交集集合先合并,无交集集合后合并;所述第二规则为存在多个有交集集合时,交集大的两个集合先合并。
本发明进一步设置为:所述步骤9),具体为,通过获取Java源代码文件集合中每个Java源代码文件依赖的jar包,得到每个Java源代码文件集合所依赖的jar包;最后,把每个Java源代码文件集合中的Java源代码文件和该集合所依赖的jar包归为一个程序子包,获得的所有程序子包为程序包解耦拆分的结果。
本发明还提供一种用于分布式静态检测系统的Java文件依赖性分析模块,该分析模块运行前述的Java文件依赖性分析方法。
与现有技术相比,本发明具有的有益效果是:
通过分析单个检测任务不同文件间依赖性关系,根据依赖性关系对检测任务包进行解耦拆分,从而实现单任务多节点多进程检测。
上述内容仅是本发明技术方案的概述,为了更清楚的了解本发明的技术手段,下面结合附图对本发明作进一步的描述。
附图说明
图1 为现有技术的基于依赖性分析的分布式静态检测系统的框图;
图2 为本发明用于分布式静态检测系统的Java文件依赖性分析方法的流程图;
图3 为本发明的示例文件语法树1;
图4 为本发明的示例文件语法树2;
图5 为本发明的示例文件语法树3;
图6 为本发明的示例文件语法树4;
图7 为本发明的示例文件语法树5;
图8为本发明的源文件依赖关系图。
具体实施方式
下面结合说明书附图,对本发明作进一步的说明。
本发明提供一种用于分布式静态检测系统的Java文件依赖性分析方法,如图2所示,包括以下步骤:
1)针对程序包中的所有文件进行信息处理,记录Java源代码文件为待分析对象。
所述步骤1)中的信息处理,具体为,对程序包中的Java源代码文件和该Java源代码文件依赖的jar包进行分类处理;其中,Java源代码文件被视为待分析对象,依赖的jar包则作为依赖项引入分析过程。
2)读取所有文件中的一个Java源代码文件。
3)生成该文件的抽象语法树。
构建代码的抽象语法树是进行文件代码依赖性分析的基础,抽象语法树会从语法层次上把具体代码文本转变为各个抽象语法种类的实例。本发明可依托于github上的开源项目——JavaParser,JavaParser把语法树抽象为名为CompilationUnit的类,每一个该类对象的实例化都记录了一个文件的抽象语法树。
具体为,使用JavaParser对待分析对象Java源代码文件以特定结构生成抽象语法树;
其中,生成的抽象语法树包括三大类节点,分别是声明节点、表达式节点和块节点;
所述声明节点,用于记录文本中与声明有关的语句或块,包括Package声明、import声明、类声明、方法声明和变量声明;
所述表达式节点,用于记录一切除了声明节点以及块节点的语句,包括方法调用语句、类创建语句和赋值语句;
所述块节点,用于表示带有花括号{}中的语句,包括类声明的类内容、方法声明中的方法内容、if语句、try语句、catch语句和for语句。
4)基于该文件的抽象语法树,对该文件所有语句进行依赖性分析,找出该文件依赖的其他文件。
所述步骤4)中的依赖性分析,具体包括以下步骤:
4-1)Package声明以及import声明分析;
首先,分析文件所在的Package以及Import的Package,得到本文件所依赖的Package;然后,直接遍历依赖的Package中的类以及Import的类,得到该文件所有可能依赖的类,以缩小下一步分析中类遍历范围;最后,记录Import Static引入的静态变量。
如图3,本发明方法遍历了抽象语法树中的PackageDeclaration节点以及所有ImportDeclaration节点,在两个矩形框中获取了A文件的两个依赖包——com.dependencyfile下package1和package2。在圆形框中获取了一个静态import,即com.dependencyfile.A3类下所有静态成员。同时也从其他importDeclaration节点获取了该文件可能存在的类依赖关系。
4-2)类声明分析;
针对该文件的public类以及文件的内部类进行分析,若public类以及文件的内部类存在父类或者实现的接口类,则将找到的父类以及实现的接口类记录下来。
如图4,本发明方法对语法树中所有ClassOrInterfaceDeclaration节点进行分析,因为A类没有内部类和其他同文件下的私有类,所以只发现了A.java本身的public类节点,即图4中的ClassOrInterfaceDeclaration节点。从该节点的ExtendedTypes和ImplementedTypes数据,模块查找到了A的父类FA以及实现的接口类IA。
4-3)变量声明分析;
分析所有变量声明语句,记录所有是类对象变量所属的类,若这些类对象变量同时初始化,同时检查初始化的值是否是类的静态成员变量,若是、则记录下该成员变量所属的类。
在该步分析时,本发明方法针对语法树中所有VariableDeclaration节点进行分析,如图4、图6以及图7中的矩形框中VariableDeclaration节点。模块会从VariableDeclaration节点的type数据获取该变量声明语句声明的变量所属的类,同时针对有初始化的语句进行分析。具体分析示例如下:A类成员变量声明语句“int a = a3”,其抽象语法树如图4矩形框中最右的 VariableDeclaration节点所示,模块通过获取该节点type数据得到了变量a所属的类为int,同时通过initializer数据得知该节点存在初始化语句。该语句等号右端是一个简单的NameExpr节点,模块对该NameExpr节点进行分析,得到初始化语句右端符号a3是A3类下静态成员变量。
4-4)方法声明分析;
分析方法声明中的返回类型、输入参数类型以及抛出错误类型。
若方法返回类型非void或者非Java基本类型,则记录下方法返回类型所属的类;若方法声明存在大于等于一个输入参数,则依次分析每个输入参数,记录下每个非Java基本类型输入参数所属的类;若方法存在抛出错误,记录下方法所有抛出错误所属的类。
该步分析时,本发明方法针对图5以及图6所示的MethodDeclaration节点进行分析。以图5作为示例,模块从节点的type数据块中获取了该方法的返回类;从parameters数据块中获取了所有入参,每个入参都是一个Parameter类节点,模块从Parameter的type数据块获取每个入参所属的类;从thrownExceptions块获取方法的抛出错误,每个抛出错误都是ClassOrInterfaceType类节点,可以直接从该类节点获取该抛出错误所属的类。
4-5)特定语句分析;
遍历所感兴趣的特定语句,记录特定语句中存在的类或者类的静态成员;其中,特定语句是指可能存在类符号的语句,包括赋值语句、类创建语句、for语句和catch语句。
在该步分析时,如图4-图7中所示,本发明方法所关心的兴趣点语句:如图4以及图6中的ObjectCreationExpr节点就是对象创建语句,模块通过获取语句new 后面构造函数,则可得到该语句所属的类;图5的ReturnStmt节点为方法的返回语句,模块通过对该节点分析,得到该语句与A3类有关;图7(a)中Catchclause节点表示了Catch块语句的AST,该节点的Parameter子节点为模块所感兴趣的条件语句,通过Parameter子节点的type数据,模块获取了该语句与AException类有关;图7(c)中ForeachStmt则为for循环语句抽象语法树表示,其variable和iterable数据,表示该for循环的条件语句,其variable下的语句为变量声明语句即为variableDeclaration节点,而该节点模块在第三步中已经分析过,故模块在分析时跳过该语句分析。
4-6)方法调用分析;
分析方法调用的输入参数,若方法调用存在大于等于一个输入参数,则依次分析每个输入参数,记录下每个非Java基本类型输入参数所属的类;分析该方法调用是否是静态成员方法,若是,则记录下该调用方法所属的类;若否,则查询该调用方法是否属于该文件public类或者内部类,若属于,则忽略该调用方法所属于的类;若不属于,则查询并记录下该调用方法所属的外部类;
如图6及图7所示,图中方框中的MethodCallExpr节点为方法调用的AST表示。MethodCallExpr节点主要分为scope、name以及arguments三个部分。一个简单的方法调用示例a.methodCall(inputParameter)在MethodCallExpr节点的表示如下:a为scope,methodCall为name,inputParameter则为arguments。
本发明方法在该步的分析主要也是针对节点的scope、name以及arguments三个部分进行分析:
首先,模块针对方法调用的入参即arguments部分进行分析,记录下入参符号所属的类型。
当节点含有scope时,模块则跳过对name分析,仅对scope符号进行解析:若scope符号为类名,则表示该方法调用为类静态成员方法调用,如图6中,MethodCallExpr2的scope为类名A4,可判断该方法调用为类A4的静态成员调用;反之,如图6中MethodCallExpr1的scope为a1,a1是方法的类对象变量,可判断方法调用为普通的类成员方法调用。
若节点不含scope,模块则通过name判断方法调用所属的类。若name所属符号是本类下声明的方法,且参数匹配,该方法调用属于本类,如图7(a)中的MethodCallExpr5,name为aMthod1,arguments入参map所属类也与本类中aMthod1所匹配,可判断该方法调用为本类方法的调用;若在本类下查找不到同名方法,则在import static类下的静态成员方法进行查找,查找到同名方法,则该方法调用属于静态成员方法,如图6中MethodCallExpr3,其name为a3StaticMethod,在本类中没该方法声明,而import static的com.dependencyfiles.A3类下找到的该方法的声明,可判断该方法为A3类的静态成员方法调用。
4-7)注解分析;
分析文件中的注解,若存在自定义注解,则把该注解所属的自定义注解类记录下来。
该步分析中,如图6所示,本发明方法在MethodDeclaration2节点查找到了annotations数据非空,获取到了该注解所属的自定义注解类AAnnotation。
4-8)搜索依赖类所在文件;
搜索定位根据步骤4-1)至步骤4-7)中所得到的依赖类所在的文件;其中,包含依赖类的jar包为该文件所依赖的jar包,包含依赖类的Java源文件为该文件所依赖的Java源代码文件。
根据步骤4-1)至步骤4-7)分析可以得到示例源代码文件A.java所依赖的类为:类FA、接口IA、类A2InnerClass、类List、类ArrayList、类A1、类AAnotation、类Map、类AException、类A3、类A4、类Set、类HashSet。
通过类名在程序源代码文件以及jar包中进行搜索,可以得出源代码文件A.java所依赖的源代码文件有FA.java、IA.java、A2.java、A1.java、A3.java、A4.java、AAnotation.java、AException.java;而类List、类ArrayList、类Map、类HashSet则属于Java.util包。
5)记录该文件与其他文件的依赖关系;其中,该文件与其他文件的依赖关系使用有向图记录。
如步骤4)根据示例分析出的结果,使用A.java指向其所依赖的源代码文件的有向图,记录下A.java文件与其所依赖的源代码文件的依赖关系;同时,Jar包Java.util被记录为A.java的依赖包。
6)判断程序包中的所有文件是否已依赖性分析完毕;
若已依赖性分析完毕、则执行下一步,若否、则跳转执行步骤2)。
7)根据程序包中的所有文件的依赖关系,生成该程序包的依赖性关系图;
根据该依赖性关系图进行分析,得到所有不可再分的独立文件集合。
所述步骤7)中的生成该程序包的依赖性关系图,具体是,将所有文件的依赖关系进行合并,生成程序包所有文件之间的总的依赖关系图;其中,该依赖关系图是一张存在无入边顶点的有环有向图。
所述步骤7)中的得到所有不可再分的独立文件集合,具体是,从依赖关系图中的所有无入边顶点出发向下分析,得到所有不依赖于其他图的子图;其中,每个子图中的全部节点都是一个不可再分文件的集合。
8)根据分布式检测系统对程序检测包的要求,对所有不可再分的独立文件集合进行合并,得到若干个符合系统需求的相互独立的Java源代码文件集合。
所述步骤8)中的对所有不可再分的独立文件集合进行合并,具体是,根据分布式检测系统所需求的文件包大小,在不超过系统要求大小之内,遵循合并规则,对所有不可再分的独立文件集合进行合并;其中,合并规则包括第一规则和第二规则;所述第一规则为交集集合先合并,无交集集合后合并;所述第二规则为存在多个有交集集合时,交集大的两个集合先合并。
程序源文件的依赖性分包结果对检测的准确性和检测时间有极大的影响,所以依赖性分析方法除了对文件依赖性进行分析之外,如何根据生成的文件依赖关系图进行对源程序进行分包也是本发明方法的一个重要步骤。
如图8所示,是一个程序源文件依赖图示例。图中箭头指向表示依赖关系,例如图中A→G表示表示A文件依赖于G文件,文件D、G、E、F之间形成的依赖环称为文件集。在处理图过程中,所有的文件集被简化为一个独立节点对外进行分析。针对文件集对关系图简化后,此时所有节点之间都是单向依赖关系。之后,找到图中所有不依赖其他节点的节点,也就是没有入边的节点,如图8中的A、B、H节点,作为遍历依赖图的起始节点。根据起始节点向下遍历,得到的所有节点集合则为最小不可分的依赖文件集合,如图8中集合(A,文件集1,文件集2)、集合(B、文件集2)以及集合(H、I、J)。最后根据实际需求的分包大小,把最小不可分集合进行合并,得到若干个相互独立的源代码文件集合图。
9)根据Java源代码文件集合,对程序包进行解耦拆分,获取所有程序子包,从而得到程序包解耦拆分的结果。
通过获取Java源代码文件集合中每个Java源代码文件依赖的jar包,得到每个Java源代码文件集合所依赖的jar包;最后,把每个Java源代码文件集合中的Java源代码文件和该集合所依赖的jar包归为一个程序子包。
根据以上分析方法,所有相互独立的Java源代码文件集合产生的程序子包为程序包解耦拆分的结果。
本发明的创新点在于,克服目前分布式检测系统中已使用的检测方法仍然是检测任务单任务单节点单进程运行所存在的不足,实现单任务多节点多进程检测。
以上显示和描述了本发明的基本原理、主要特征及优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。
Claims (9)
1.一种用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于,包括以下步骤:
1)针对程序包中的所有文件进行信息处理,记录Java源代码文件为待分析对象;
2)读取所有文件中的一个Java源代码文件;
3)生成该文件的抽象语法树;
4)基于该文件的抽象语法树,对该文件所有语句进行依赖性分析,找出该文件依赖的其他文件;
5)记录该文件与其他文件的依赖关系;
其中,该文件与其他文件的依赖关系使用有向图记录;
6)判断程序包中的所有文件是否已依赖性分析完毕;
若已依赖性分析完毕、则执行下一步,若否、则跳转执行步骤2);
7)根据程序包中的所有文件的依赖关系,生成该程序包的依赖性关系图;
根据该依赖性关系图进行分析,得到所有不可再分的独立文件集合;
8)根据分布式检测系统对程序检测包的要求,对所有不可再分的独立文件集合进行合并,得到若干个符合系统需求的相互独立的Java源代码文件集合;
9)根据Java源代码文件集合,对程序包进行解耦拆分,获取所有程序子包,从而得到程序包解耦拆分的结果。
2.根据权利要求1所述的用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于:所述步骤1)中的信息处理,具体为,对程序包中的Java源代码文件和该Java源代码文件依赖的jar包进行分类处理;其中,Java源代码文件被视为待分析对象,依赖的jar包则作为依赖项引入分析过程。
3.根据权利要求2所述的用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于:所述步骤3)生成该文件的抽象语法树,具体为,使用JavaParser对待分析对象Java源代码文件以特定结构生成抽象语法树;
其中,生成的抽象语法树包括三大类节点,分别是声明节点、表达式节点和块节点;
所述声明节点,用于记录文本中与声明有关的语句或块,包括Package声明、import声明、类声明、方法声明和变量声明;
所述表达式节点,用于记录一切除了声明节点以及块节点的语句,包括方法调用语句、类创建语句和赋值语句;
所述块节点,用于表示带有花括号{}中的语句,包括类声明的类内容、方法声明中的方法内容、if语句、try语句、catch语句和for语句。
4.根据权利要求3所述的用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于,所述步骤4)中的依赖性分析,具体包括以下步骤:
4-1)Package声明以及import声明分析;
首先,分析文件所在的Package以及Import的Package,得到本文件所依赖的Package;
然后,直接遍历依赖的Package中的类以及Import的类,得到该文件所有可能依赖的类,以缩小下一步分析中类遍历范围;
最后,记录Import Static引入的静态变量;
4-2)类声明分析;
针对该文件的public类以及文件的内部类进行分析,若public类以及文件的内部类存在父类或者实现的接口类,则将找到的父类以及实现的接口类记录下来;
4-3)变量声明分析;
分析所有变量声明语句,记录所有是类对象变量所属的类,若这些类对象变量同时初始化,同时检查初始化的值是否是类的静态成员变量,若是、则记录下该成员变量所属的类;
4-4)方法声明分析;
分析方法声明中的返回类型、输入参数类型以及抛出错误类型;
若方法返回类型非void或者非Java基本类型,则记录下方法返回类型所属的类;
若方法声明存在大于等于一个输入参数,则依次分析每个输入参数,记录下每个非Java基本类型输入参数所属的类;
若方法存在抛出错误,记录下方法所有抛出错误所属的类;
4-5)特定语句分析;
遍历所感兴趣的特定语句,记录特定语句中存在的类或者类的静态成员;
其中,特定语句是指可能存在类符号的语句,包括赋值语句、类创建语句、for语句和catch语句;
4-6)方法调用分析;
分析方法调用的输入参数,若方法调用存在大于等于一个输入参数,则依次分析每个输入参数,记录下每个非Java基本类型输入参数所属的类;
分析该方法调用是否是静态成员方法,若是,则记录下该调用方法所属的类;若否,则查询该调用方法是否属于该文件public类或者内部类,若属于,则忽略该调用方法所属于的类;若不属于,则查询并记录下该调用方法所属的外部类;
4-7)注解分析;
分析文件中的注解,若存在自定义注解,则把该注解所属的自定义注解类记录下来;
4-8)搜索依赖类所在文件;
搜索定位根据步骤4-1)至步骤4-7)中所得到的依赖类所在的文件;
其中,包含依赖类的jar包为该文件所依赖的jar包,包含依赖类的Java源文件为该文件所依赖的Java 源代码文件。
5.根据权利要求1所述的用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于:所述步骤7)中的生成该程序包的依赖性关系图,具体是,将所有文件的依赖关系进行合并,生成程序包所有文件之间的总的依赖关系图;
其中,该依赖关系图是一张存在无入边顶点的有环有向图。
6.根据权利要求5所述的用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于:所述步骤7)中的得到所有不可再分的独立文件集合,具体是,从依赖关系图中的所有无入边顶点出发向下分析,得到所有不依赖于其他图的子图;
其中,每个子图中的全部节点都是一个不可再分文件的集合。
7.根据权利要求1所述的用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于:所述步骤8)中的对所有不可再分的独立文件集合进行合并,具体是,根据分布式检测系统所需求的文件包大小,在不超过系统要求大小之内,遵循合并规则,对所有不可再分的独立文件集合进行合并,得到若干个符合系统需求的相互独立的Java源代码文件集合;
其中,合并规则包括第一规则和第二规则;所述第一规则为交集集合先合并,无交集集合后合并;所述第二规则为存在多个有交集集合时,交集大的两个集合先合并。
8.根据权利要求4所述的用于分布式静态检测系统的Java文件依赖性分析方法,其特征在于:所述步骤9),具体为,通过获取Java源代码文件集合中每个Java源代码文件依赖的jar包,得到每个Java源代码文件集合所依赖的jar包;最后,把每个Java源代码文件集合中的Java源代码文件和该集合所依赖的jar包归为一个程序子包,获得的所有程序子包为程序包解耦拆分的结果。
9.一种用于分布式静态检测系统的Java文件依赖性分析模块,其特征在于:该分析模块运行权利要求1-8任意一项所述的Java文件依赖性分析方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810869157.6A CN109033843B (zh) | 2018-08-02 | 2018-08-02 | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810869157.6A CN109033843B (zh) | 2018-08-02 | 2018-08-02 | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109033843A true CN109033843A (zh) | 2018-12-18 |
CN109033843B CN109033843B (zh) | 2022-06-10 |
Family
ID=64647881
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810869157.6A Active CN109033843B (zh) | 2018-08-02 | 2018-08-02 | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109033843B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110187967A (zh) * | 2019-05-15 | 2019-08-30 | 南瑞集团有限公司 | 一种适用于依赖分析工具的内存预测方法及装置 |
CN110618931A (zh) * | 2019-08-14 | 2019-12-27 | 重庆金融资产交易所有限责任公司 | 依赖关系检测方法、装置、计算机设备及可读存储介质 |
CN110716765A (zh) * | 2019-09-29 | 2020-01-21 | 浙江网新恒天软件有限公司 | 一种单体应用Faas化的方法 |
CN112256637A (zh) * | 2020-10-19 | 2021-01-22 | 贝壳技术有限公司 | 一种基于抽象语法树的文件管理方法、装置及存储介质 |
CN112650680A (zh) * | 2020-12-28 | 2021-04-13 | 南京航空航天大学 | 基于抽象语法树的冗余变量和冗余方法的检测方法及系统 |
CN113448553A (zh) * | 2021-06-23 | 2021-09-28 | 南京大学 | 一种c语言项目依赖信息管理和可视化的方法及系统 |
CN113467786A (zh) * | 2021-05-27 | 2021-10-01 | 东南大学 | 一种基于软件依赖关系提取的多层架构识别方法 |
CN113703774A (zh) * | 2021-08-26 | 2021-11-26 | 东南大学 | 一种基于依赖结构特征的Feature Envy代码坏味检测方法 |
CN115167834A (zh) * | 2022-09-08 | 2022-10-11 | 杭州新中大科技股份有限公司 | 一种基于代码数据化的源代码自动生成方法及装置 |
CN116048615A (zh) * | 2023-01-31 | 2023-05-02 | 安徽工业大学 | 基于自然语言处理的分布式程序切片方法、装置及设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101241532A (zh) * | 2008-02-15 | 2008-08-13 | 北京邮电大学 | 面向源代码的基于不等式组求解的缓冲区溢出检测方法 |
CN106294156A (zh) * | 2016-08-11 | 2017-01-04 | 北京邮电大学 | 一种静态代码缺陷检测分析方法及装置 |
-
2018
- 2018-08-02 CN CN201810869157.6A patent/CN109033843B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN101241532A (zh) * | 2008-02-15 | 2008-08-13 | 北京邮电大学 | 面向源代码的基于不等式组求解的缓冲区溢出检测方法 |
CN106294156A (zh) * | 2016-08-11 | 2017-01-04 | 北京邮电大学 | 一种静态代码缺陷检测分析方法及装置 |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110187967A (zh) * | 2019-05-15 | 2019-08-30 | 南瑞集团有限公司 | 一种适用于依赖分析工具的内存预测方法及装置 |
CN110618931A (zh) * | 2019-08-14 | 2019-12-27 | 重庆金融资产交易所有限责任公司 | 依赖关系检测方法、装置、计算机设备及可读存储介质 |
CN110716765B (zh) * | 2019-09-29 | 2023-04-07 | 浙江网新恒天软件有限公司 | 一种单体应用Faas化的方法 |
CN110716765A (zh) * | 2019-09-29 | 2020-01-21 | 浙江网新恒天软件有限公司 | 一种单体应用Faas化的方法 |
CN112256637A (zh) * | 2020-10-19 | 2021-01-22 | 贝壳技术有限公司 | 一种基于抽象语法树的文件管理方法、装置及存储介质 |
CN112650680A (zh) * | 2020-12-28 | 2021-04-13 | 南京航空航天大学 | 基于抽象语法树的冗余变量和冗余方法的检测方法及系统 |
CN113467786A (zh) * | 2021-05-27 | 2021-10-01 | 东南大学 | 一种基于软件依赖关系提取的多层架构识别方法 |
CN113467786B (zh) * | 2021-05-27 | 2024-05-17 | 东南大学 | 一种基于软件依赖关系提取的多层架构识别方法 |
CN113448553A (zh) * | 2021-06-23 | 2021-09-28 | 南京大学 | 一种c语言项目依赖信息管理和可视化的方法及系统 |
CN113448553B (zh) * | 2021-06-23 | 2023-11-03 | 南京大学 | 一种c语言项目依赖信息管理和可视化的方法及系统 |
CN113703774A (zh) * | 2021-08-26 | 2021-11-26 | 东南大学 | 一种基于依赖结构特征的Feature Envy代码坏味检测方法 |
CN113703774B (zh) * | 2021-08-26 | 2024-05-17 | 东南大学 | 一种基于依赖结构特征的Feature Envy代码坏味检测方法 |
CN115167834A (zh) * | 2022-09-08 | 2022-10-11 | 杭州新中大科技股份有限公司 | 一种基于代码数据化的源代码自动生成方法及装置 |
CN116048615A (zh) * | 2023-01-31 | 2023-05-02 | 安徽工业大学 | 基于自然语言处理的分布式程序切片方法、装置及设备 |
CN116048615B (zh) * | 2023-01-31 | 2023-08-25 | 安徽工业大学 | 基于自然语言处理的分布式程序切片方法、装置及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN109033843B (zh) | 2022-06-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109033843A (zh) | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 | |
Fantechi et al. | Applications of linguistic techniques for use case analysis | |
CN102567200A (zh) | 基于函数调用图的并行化安全漏洞检测方法 | |
Malloy et al. | An empirical analysis of the transition from python 2 to python 3 | |
CN103914379B (zh) | 故障自动注入与故障检测的方法及其系统 | |
CN105243018B (zh) | 一种面向对象的类测试数据生成方法 | |
CN109241104B (zh) | 决策型分布式数据库系统中aisql的解析器及其实现方法 | |
Jin et al. | Enre: a tool framework for extensible entity relation extraction | |
CN110059006A (zh) | 代码审计方法及装置 | |
CN102521126B (zh) | 基于模块分解技术的软件缺陷检测系统的复杂性分析方法 | |
CN108563561A (zh) | 一种程序隐性约束提取方法及系统 | |
CN105930267B (zh) | 一种基于数据库字典的存储过程静态检测方法及系统 | |
CN102087629A (zh) | 一种基于Agent嵌入式软件的不变量测试方法与工具 | |
Pan et al. | Class structure refactoring of object-oriented softwares using community detection in dependency networks | |
Schmidt et al. | Automatic generation of thread communication graphs from SystemC source code | |
Ortin et al. | Cnerator: A Python application for the controlled stochastic generation of standard C source code | |
Izsó et al. | MONDO-SAM: A Framework to Systematically Assess MDE Scalability. | |
CN110286882A (zh) | 一种基于模型检测的前台系统设计与验证方法 | |
Núñez-Varela et al. | Building a user oriented application for generic source code metrics extraction from a metrics framework | |
Shao et al. | Combining lexical and structural information for static bug localisation | |
Romanov et al. | Representing programs with dependency and function call graphs for learning hierarchical embeddings | |
Karus et al. | Predicting the maintainability of XSL transformations | |
Zhang | An Approach for Extracting UML Diagram from Object-Oriented Program Based on J2X | |
JP2011154568A (ja) | 情報処理装置、プログラム検証方法およびプログラム | |
Henry et al. | Complexity measurement of a graphical programming language |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | 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 |