一种模块依赖关系的分析方法及系统技术方案

技术编号:19902964 阅读:34 留言:0更新日期:2018-12-26 02:46
本发明专利技术公开了一种模块依赖关系的分析方法及系统,涉及通信技术领域。模块依赖关系的分析方法包括:获取待分析软件中所有的非系统类模块以构建一个模块组;得到模块组中所有模块的两两之间的依赖关系;建立表示模块组中所有模块的两两之间的依赖关系的依赖关系矩阵,根据依赖关系矩阵判断待分析软件中非系统类模块之间是否存在循环依赖关系。本发明专利技术能够判定待分析软件中作为模块的二进制目标文件之间是否存在循环依赖关系。

【技术实现步骤摘要】
一种模块依赖关系的分析方法及系统
本专利技术涉及通信
,具体是涉及一种模块依赖关系的分析方法及系统。
技术介绍
模块化设计是软件设计的一个重要方法,模块设计应遵循高内聚低耦合的原则。内聚是模块内部各成分之间关联程度的一种度量,耦合是模块之间相互连接的一种度量。模块间的耦合关系是指模块之间的依赖关系,包括控制关系、引用关系和数据传递关系等。模块依赖关系的控制在软件设计阶段进行,而模块依赖关系的分析则是针对软件开发所交付产物的后评估和度量,当设计不符合高内聚低耦合的原则时,或者设计未覆盖到每一项执行时,或者开发过程管控不力时,就可能出现模块之间的依赖关系不符合预期,甚至出现循环依赖关系,更不符合高内聚低耦合的原则。模块的循环依赖关系可简单描述如下:比如模块A依赖模块B,同时模块B又依赖模块A。再比如模块A依赖模块B,模块B依赖模块C,而模块C又依赖模块A,从而构成一个环形的循环依赖关系。上述环形的循环依赖关系仅为示例,可以存在其它形式的或者更复杂的循环依赖关系。当模块是可以形成最终可执行文件的二进制目标文件时,例如Linux操作系统下的静态库.a文件以及动态库.so文件等,模块之间的依赖关系主要指模块之间的函数引用关系。以C语言为例,函数引用方式有两种:(1)通过函数名直接调用;(2)通过函数指针间接调用。从软件设计的角度来说,当模块A通过函数名直接调用模块B时,模块A依赖模块B;当模块A通过函数指针间接调用模块B时,模块A不依赖模块B,即模块A和模块B之间并未耦合。因此在分析模块之间的依赖关系时,仅需要分析模块之间通过函数名的直接调用关系。目前可以通过目标码来分析模块之间的依赖关系,例如利用Linux系统中的ldd命令分析二进制目标文件之间的依赖关系。但是该命令只能针对动态库,不能针对静态库,并且仅能分析二进制目标文件之间是否存在依赖关系,而不能分析这些二进制目标文件之间是否存在循环依赖关系等。
技术实现思路
针对现有技术中存在的缺陷,本专利技术的目的在于提供一种模块依赖关系的分析方法及系统,判定待分析软件中作为模块的二进制目标文件之间是否存在循环依赖关系。本专利技术提供一种模块依赖关系的分析方法,其包括:获取待分析软件中所有的非系统类模块以构建一个模块组;得到模块组中所有模块的两两之间的依赖关系;建立表示模块组中所有模块的两两之间的依赖关系的依赖关系矩阵,根据依赖关系矩阵判断待分析软件中非系统类模块之间是否存在循环依赖关系。在上述技术方案的基础上,在所述模块组中的模块之间进行函数名直接调用分析,得到所有模块的两两之间的依赖关系;或者,当所述模块组包括静态库文件类型的非系统类模块时,将每个静态库文件类型的非系统类模块转换为动态库文件类型的模块,通过ldd函数得到所有模块的两两之间的依赖关系;或者,当所述模块组包括静态库文件类型的非系统类模块和动态库文件类型的非系统类模块时,在静态库文件类型的模块之间以及静态库文件类型的模块与动态库文件类型的模块之间,通过函数名直接调用分析得到模块的两两之间的依赖关系,以及通过ldd函数得到动态库文件类型的模块的两两之间的依赖关系。在上述技术方案的基础上,在所述模块组中模块Mi和Mj之间进行函数名直接调用分析的方法为:当模块Mi的一个外部符号与模块Mj的一个全局符号相同时,判定模块Mi对模块Mj存在函数引用关系,即Mi依赖Mj,其中,全局符号为定义在模块内部的函数名,外部符号为定义在模块外部并且在该模块内引用的函数名。在上述技术方案的基础上,当所述静态库文件类型的非系统类模块为.a文件时,使用编译工具将.a文件展开为.obj文件,再将.obj文件编译为.so文件。在上述技术方案的基础上,将所述模块组中第i个模块Mi和第j个模块Mj两两之间的依赖关系记为Rij=R(Mi,Mj)和Rji=R(Mj,Mi),Rij=0表示Mi不依赖Mj,Rij=1则表示Mi依赖Mj;Rji=0表示Mj不依赖Mi,Rji=1则表示Mj依赖Mi,1≤i≤n,1≤j≤n,n为所述模块组的模块总数;所述依赖关系矩阵R为n×n矩阵,Rij和Rji均为所述依赖关系矩阵R的元素。在上述技术方案的基础上,在所述依赖关系矩阵R中,当Rij=Rji=1时;或者,当R(Mi,Mk1)=1,R(Mk1,Mk2)=1,…,R(Mkp,Mj)=1和R(Mj,Mi)=1时,1≤i,k1,…,kp,j≤n,则表示所述非系统类模块之间存在循环依赖关系。在上述技术方案的基础上,根据所述依赖关系矩阵R,生成有向图G=<VG,EG>,其中,有向图的每个节点VG表示所述模块组的一个模块,每条边EG表示该条边的两端节点之间的依赖关系,EG={Mi→Mj,Mi和Mj∈VG,i≠j},Mi→Mj表示模块Mi依赖Mj;根据所述有向图G得到所述非系统类模块之间的依赖层次关系。在上述技术方案的基础上,当所述有向图G中存在有向回路时,则判定所述非系统类模块之间存在循环依赖关系。在上述技术方案的基础上,根据所述依赖关系矩阵R,计算所述有向图的每个节点的入度;删除入度为0的节点,并将与被删除节点相连的节点的入度减去1,直到节点全部被删除或者剩余节点的入度不为0;当剩余节点的入度不为0时,则判定所述非系统类模块之间存在循环依赖关系。本专利技术还提供一种模块依赖关系的分析系统,其包括:预处理单元,其用于获取待分析软件中所有的非系统类模块以构建一个模块组;分析单元,其用于得到模块组中所有模块的两两之间的依赖关系;汇总处理单元,其用于建立表示模块组中所有模块的两两之间的依赖关系的依赖关系矩阵,根据依赖关系矩阵判断待分析软件中非系统类模块之间是否存在循环依赖关系。与现有技术相比,本专利技术的优点如下:(1)建立表示所有模块的两两之间的依赖关系的依赖关系矩阵,根据依赖关系矩阵判断待分析软件中非系统类模块之间是否存在循环依赖关系。可以分析模块依赖关系的层次关系,进而判定模块之间是否存在循环依赖关系,为软件协同开发单元所交付的软件质量提供检测依据。(2)不依赖源码,就可对待分析软件中作为模块的二进制目标文件进行分析,不但可以分析动态库文件类型的非系统类模块,也可以分析静态库文件类型的非系统类模块,而且可以准确判定非系统类模块是否存在循环依赖关系。(3)根据依赖关系矩阵,计算有向图的每个节点的入度;删除入度为0的节点,并将与被删除节点相连的节点的入度减去1,直到节点全部被删除或者剩余节点的入度不为0;当剩余节点的入度不为0时,则判定非系统类模块之间存在循环依赖关系,计算过程简单,能够快速获得模块依赖关系。附图说明图1是本专利技术第一实施例模块依赖关系的分析方法流程图;图2是本专利技术第一实施例中步骤S1的流程图;图3是本专利技术第一实施例中步骤S2的流程图;图4是本专利技术第四实施例模块中模块之间的依赖层次关系;图5是本专利技术第五实施例模块中非系统类模块之间是否存在循环依赖关系的分析方法流程图;图6是本专利技术第六实施例模块依赖关系的分析系统的应用示意图。具体实施方式下面结合附图及具体实施例对本专利技术作进一步的详细描述。本专利技术实施例提供一种模块依赖关系的分析方法,其包括:获取待分析软件中所有的非系统类模块以构建一个模块组;得到模块组中所有模块的两两之间的依赖关系;建立表本文档来自技高网
...

【技术保护点】
1.一种模块依赖关系的分析方法,其特征在于,其包括:获取待分析软件中所有的非系统类模块以构建一个模块组;得到模块组中所有模块的两两之间的依赖关系;建立表示模块组中所有模块的两两之间的依赖关系的依赖关系矩阵,根据依赖关系矩阵判断待分析软件中非系统类模块之间是否存在循环依赖关系。

【技术特征摘要】
1.一种模块依赖关系的分析方法,其特征在于,其包括:获取待分析软件中所有的非系统类模块以构建一个模块组;得到模块组中所有模块的两两之间的依赖关系;建立表示模块组中所有模块的两两之间的依赖关系的依赖关系矩阵,根据依赖关系矩阵判断待分析软件中非系统类模块之间是否存在循环依赖关系。2.如权利要求1所述的模块依赖关系的分析方法,其特征在于:在所述模块组中的模块之间进行函数名直接调用分析,得到所有模块的两两之间的依赖关系;或者,当所述模块组包括静态库文件类型的非系统类模块时,将每个静态库文件类型的非系统类模块转换为动态库文件类型的模块,通过ldd函数得到所有模块的两两之间的依赖关系;或者,当所述模块组包括静态库文件类型的非系统类模块和动态库文件类型的非系统类模块时,在静态库文件类型的模块之间以及静态库文件类型的模块与动态库文件类型的模块之间,通过函数名直接调用分析得到模块的两两之间的依赖关系,以及通过ldd函数得到动态库文件类型的模块的两两之间的依赖关系。3.如权利要求2所述的模块依赖关系的分析方法,其特征在于,在所述模块组中模块Mi和Mj之间进行函数名直接调用分析的方法为:当模块Mi的一个外部符号与模块Mj的一个全局符号相同时,判定模块Mi对模块Mj存在函数引用关系,即Mi依赖Mj,其中,全局符号为定义在模块内部的函数名,外部符号为定义在模块外部并且在该模块内引用的函数名。4.如权利要求2所述的模块依赖关系的分析方法,其特征在于:当所述静态库文件类型的非系统类模块为.a文件时,使用编译工具将.a文件展开为.obj文件,再将.obj文件编译为.so文件。5.如权利要求1所述的模块依赖关系的分析方法,其特征在于:将所述模块组中第i个模块Mi和第j个模块Mj两两之间的依赖关系记为Rij=R(Mi,Mj)和Rji=R(Mj,Mi),Rij=0表示Mi不依赖Mj,Rij=1则表示Mi依赖Mj;R...

【专利技术属性】
技术研发人员:曾颜
申请(专利权)人:烽火通信科技股份有限公司
类型:发明
国别省市:湖北,42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1