CN113448553B - 一种c语言项目依赖信息管理和可视化的方法及系统 - Google Patents
一种c语言项目依赖信息管理和可视化的方法及系统 Download PDFInfo
- Publication number
- CN113448553B CN113448553B CN202110696402.XA CN202110696402A CN113448553B CN 113448553 B CN113448553 B CN 113448553B CN 202110696402 A CN202110696402 A CN 202110696402A CN 113448553 B CN113448553 B CN 113448553B
- Authority
- CN
- China
- Prior art keywords
- file
- symbol
- information
- name
- graph
- 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.)
- Active
Links
- 230000001419 dependent effect Effects 0.000 title claims abstract description 57
- 238000000034 method Methods 0.000 title claims abstract description 23
- 230000006870 function Effects 0.000 claims description 29
- 238000010586 diagram Methods 0.000 claims description 14
- 238000012800 visualization Methods 0.000 claims description 13
- 210000001072 colon Anatomy 0.000 claims description 7
- 238000000605 extraction Methods 0.000 claims description 4
- 238000007726 management method Methods 0.000 claims 7
- 238000007794 visualization technique Methods 0.000 claims 1
- 238000005516 engineering process Methods 0.000 abstract description 11
- 239000012634 fragment Substances 0.000 description 7
- 230000000007 visual effect Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 4
- 238000012216 screening Methods 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000002203 pretreatment Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 238000000844 transformation Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
- G06F16/285—Clustering or classification
- G06F16/287—Visualization; Browsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/9038—Presentation of query results
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/22—Procedural
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种C语言项目依赖信息管理和可视化的方法及系统,包括:提取项目中单个C语言文件的信息;将每个文件提取到的信息合并保存到关系型数据库中;基于关系型数据库,根据用户的查询提供多种依赖关系结果;获取依赖图信息并保存至图数据库;基于图数据库,根据用户的查询提供多种可视化的依赖关系图,本发明提供了一种对C语言项目中的复杂的依赖信息的高效管理,精简存储和便捷访问的方法,同时基于基础信息抽取更丰富的依赖信息,这些数据可以为自动化程序理解技术提供支持;本发明同时提供了多种可视化的依赖关系图的生成方法,使得开发人员可以直观了解大型项目中的依赖关系。
Description
技术领域
本发明属于软件工程和信息管理领域,尤其涉及一种C语言项目依赖信息管理和可视化的方法及系统。
背景技术
在大规模软件工程项目的开发中,自动化程序理解技术的作用越来越重要,已经有很多基于该技术的相关工具帮助提升开发人员的开发效率。而这些技术往往依赖项目源代码中细粒度的、丰富的、多层次的依赖信息。
C语言在今天被广泛用于底层开发,包括编译器,驱动,嵌入式软件,操作系统内核等软件的开发。但是作为一门古老的通用程序设计语言,由于它偏向底层,设计上支持基于宏的预处理机制,支持独立编译,之后再链接。同时C语言语法中包括多种类型的符号,每个符号存在多种使用状态,还存在复杂的命名空间,因此C语言代码中蕴含着复杂的依赖关系。
因此,需要一种C语言项目依赖信息管理和可视化的方法和装置,针对C语言项目中复杂的依赖信息,对多种类的依赖信息抽象出较为统一的保存形式,高效地管理这些依赖信息,便捷地访问这些依赖信息,基于基础信息抽取更丰富的依赖信息,同时提供可视化的依赖关系图。
发明内容
为此,需要提供一种C语言项目依赖信息管理和可视化的方法及系统,可实现对C语言项目中的复杂依赖信息的高效管理,精简存储和便捷访问,基于基础信息抽取更丰富的依赖信息,同时提供多种可视化的依赖关系图。
为实现上述目的,发明人提供了一种C语言项目依赖信息管理和可视化的方法,包括:提取项目中单个C语言文件的信息;将每个文件提取到的信息合并保存到关系型数据库中;基于关系型数据库,根据用户的查询提供多种依赖关系结果;获取依赖图信息并保存至图数据库;基于图数据库,根据用户的查询提供多种可视化的依赖关系图。
作为本发明的一种优选方式,所述提取项目中单个C语言文件的符号信息,包括:提取单个C语言文件中的符号信息,对C语言文件中出现的每个符号,提取该符号的全限定名、符号类型,所述符号类型包括函数符号、变量符号、宏符号、类型符号和文件符号;提取单个C语言文件中的引用信息,对C语言文件中出现的符号引用,提取该引用的对应符号的全限定名、所在文件、所在位置和引用类型,所述所在位置包括行号和列号,所述引用类型包括声明、定义、使用和宏,所述宏包含定义、取消定义、宏展开和条件分支。
作为本发明的一种优选方式,所述符号的全限定名包括文件名、符号名、偏移量、限定符和分隔符,所述文件名指该符号的定义所在的文件路径,所述偏移量为该符号的定义位置相对于文件开头的偏移字符数,所述限定符为标识该局部符号所在的局部命名空间的其他符号的符号名,所述分隔符包括正斜杠分隔符、双冒号分隔符、#分隔符和@分隔符,其中:文件名与限定符、文件名与符号名、偏移量与限定符、偏移量与符号名之间用正斜杠分隔符隔开,限定符与限定符、限定符与符号名之间用双冒号分隔符隔开,文件名与偏移量之间用@分隔符隔开,#分隔符、@分隔符还出现在符号名之前,用于标识符号的类型;
作为本发明的一种优选方式,提取符号的全限定名,包括:提取函数符号的全限定名,格式为“文件名/函数名”,文件名是指函数定义所在的文件名,如果未找到函数定义,那么没有文件名和正斜杠分隔符;提取变量符号的全限定名,所述变量包括全局变量和局部变量,全局变量的全限定名格式为“文件名/变量名”,局部变量的全限定名格式为“文件名@偏移量/限定符::变量名”,其中,如果该局部变量定义在一个嵌套的命名空间中,“限定符::”可重复多次,文件名和偏移量是指变量定义所在的文件名和位置,如果未找到变量定义,那么没有文件名、偏移量、@分隔符和正斜杠分隔符,函数的参数视为定义在该函数命名空间中的局部变量,结构体、联合体和枚举型中的成员视为定义在该类型命名空间中的局部变量;提取宏符号的全限定名,宏符号的全限定名格式为“#宏符号名”;提取类型符号的全限定名,全局类型的全限定名格式为“文件名/限定符::类型名”,对于结构体、联合体和枚举型,类型名前固定有一组限定符和双冒号分隔符,分别是“struct::”、“union::”、“enum::”,全局类型符号的全限定名没有其他的限定符,局部类型符号的全限定名存在其他的限定符,局部类型的全限定名格式为“文件名@偏移量/限定符::类型名”,其中,如果该局部类型定义在一个嵌套的命名空间中,“限定符::”可重复多次,文件名和偏移量是指该类型的定义所在的文件名和位置,如果未找到类型的定义,那么没有文件名、偏移量、@分隔符和正斜杠分隔符;提取文件类型符号的全限定名,文件符号的全限定名格式为“@文件路径”。
作为本发明的一种优选方式,所述将每个文件提取到的信息合并保存到关系型数据库中,包括:新建关系型数据库和表,初始化关系型数据库,创建SymbolTable,ReferenceTable、FileTable三张空表,分别存储符号信息、引用信息和文件的路径,三张表均使用自增的主键,分别称为sid,refid,fid;合并文件信息,将项目中分析过的C语言文件的信息添加到FileTable,对出现在引用信息中的每个文件,如果该文件的完整路径不在FileTable中,将该文件的路径存入FileTable;合并符号信息,对于每个文件中的每个符号信息,如果SymbolTable中不存在全限定名与该符号的全限定名相同的数据,那么将该符号信息存入SymbolTable;合并引用信息,对于每个文件中的每个引用信息,如果ReferenceTable中不存在所在文件、所在位置、引用符号的全限定名与该引用的对应信息完全相同的数据,那么在SymbolTable中通过对应符号的全限定名获得sid,将该引用信息中引用符号的全限定名替换为sid;在FileTable中通过文件路径获得fid,将该引用信息中引用符号的所在文件替换为fid,将修改过的引用信息存入RefTable;修正符号信息,对于SymbolTable中的符号信息,如果存在一个符号A的全限定名不含文件名,另一个符号B的全限定名去除文件名后与A符号的全限定名完全相同,将ReferenceTable中sid对应为符号A的数据全部改为与B符号对应,并删除SymbolTable中A符号的记录;
作为本发明的一种优选方式,所述基于关系型数据库,根据用户的查询提供多种依赖关系结果,包括:根据用户输入的引用信息,提取对应的符号的定义-使用关系;根据用户输入的符号信息,提取对应符号与其他符号依赖关系;根据用户输入的文件信息,提取对应文件的文件包含关系;根据用户输入的文件信息,提取对应文件与其他文件之间的依赖关系。
作为本发明的一种优选方式,所述根据用户输入的引用信息,提取对应的符号的定义-使用关系,包括:根据用户输入的引用信息,在ReferenceTable中查找到对应信息,获得该引用对应符号的sid;根据sid在SymbolTable中查找到该符号的全限定名、符号类型信息;根据sid在ReferenceTable中查找到所有该符号的引用记录,其中包括定义、声明和使用多种类型的引用,在使用类型的引用与声明、定义类型的引用建立定义-使用关系;输出该符号的信息以及对应的定义-使用依赖关系;
作为本发明的一种优选方式,所述根据用户输入的符号信息,提取对应符号与其他符号依赖关系,包括:根据用户输入的符号信息,在SymbolTable中获得该符号的sid;在ReferenceTable中使用sid查找到该符号对应的定义类型引用和声明类型引用;对每个该符号的定义引用和声明引用,在ReferenceTable中查找到使用位置位于定义体和声明中的引用信息;对于获得的每个引用信息,使用sid从SymbolTable中获得该符号的信息;在用户查询的符号与获得的每个符号之间建立符号依赖关系并输出。
作为本发明的一种优选方式,所述根据用户输入的文件信息,提取对应文件的文件包含关系,包括:根据用户输入的文件信息,在FileTable中获得该文件的fid;根据fid在ReferenceTable中查找到所有该文件中的包含类型的引用信息;对于获得的每个引用信息,获得该引用对应的符号的sid,根据sid在SymbolTable中查找该符号的全限定名,根据文件类型的全限定名格式,去除开头的@分隔符得到文件路径;对于获得的每个文件路径,在FileTable中获得对应的文件信息;在用户查询的文件与获得的每个文件之间建立文件包含关系并输出;
作为本发明的一种优选方式,所述根据用户输入的文件信息,提取对应文件与其他文件之间的依赖关系,包括:根据用户输入的文件信息,在FileTable中获得该文件的fid;根据fid在ReferenceTable中查找到所有该文件中的使用类型的引用信息;对于中获得的每个引用信息,获得该引用对应的符号的sid,根据sid在ReferenceTable中查找该符号的定义类型引用和声明类型引用;对于获得的每个定义类型引用和声明类型引用的信息,获得该引用对应的fid,根据fid在FileTable中找到对应的文件信息;在用户查询的文件与获得的每个文件之间建立文件依赖关系并输出。
作为本发明的一种优选方式,所述获取依赖图信息并保存至图数据库,包括:新建图数据库、初始化图节点、初始化关系型数据库,图中包含符号、引用、文件三种类型的节点,对每个节点上的信息,使用关系型数据库中SymbolTable,ReferenceTable,FileTable对应的符号信息、引用信息和文件信息;在图节点间构建文件间依赖关系子图,基于关系型数据库对每个文件提取文件间的依赖关系,然后构建该子图,该子图包含两种类型的边:文件-引用边和引用-文件边,文件-引用边由文件节点指向引用节点,表示使用关系,即该文件存在这个引用,引用-文件边由引用节点指向文件节点,表示定位关系,即该引用对应的符号的定义/声明位于这个文件,文件节点和文件节点之间通过引用节点间接地连接在一起,表示文件之间的依赖关系;在图节点间中构建文件的包含关系子图,基于关系型数据库对每个文件提取包含关系,然后构建该子图,该子图包含文件-文件边,由文件节点指向文件节点,表示文件之间的直接包含关系;在图节点间构建符号间依赖关系子图,基于关系型数据库对每个符号提取符号间的依赖关系,然后构建该子图,该子图包含符号-符号边,由符号节点指向符号节点,表示符号之间的依赖关系;在图节点间构建符号的定义-使用关系子图,基于关系型数据库对每个符号提取该符号的定义-使用关系,然后构建该子图,该子图包含符号-引用边,由符号节点指向引用节点,表示该符号拥有这个引用信息,即引用的是该符号,在与该符号相连的所有引用节点中,使用类型的引用节点和定义/声明类型的引用节点表示该符号的定义-使用关系。
作为本发明的一种优选方式,所述基于图数据库,根据用户的查询提供多种可视化的依赖关系图,包括:根据用户输入的符号信息,提取对应的符号的定义-使用关系图;根据用户输入的符号信息,提取对应的符号间依赖关系图;根据用户输入的文件信息,提取对应的文件的包含关系图;根据用户输入的依赖文件和被依赖文件信息,提取依赖文件与被依赖文件之间的依赖关系图。
作为本发明的一种优选方式,所述根据用户输入的符号信息,提取对应的符号的定义-使用关系图,包括:根据用户输入的符号信息在图数据库中找到对应的符号节点;在图数据库中找到与该符号节点相连的符号-引用边,并找到每条边指向的引用节点;输出由符号节点、引用节点和符号-引用边形成的子图;
作为本发明的一种优选方式,所述根据用户输入的符号信息,提取对应的符号间依赖关系图,包括:根据用户输入的符号信息在图数据库中找到对应的符号节点;在图数据库中找到与该符号节点相连的符号-符号边,并找到每条边指向的符号节点;输出由符号节点和符号-符号边形成的子图;
作为本发明的一种优选方式,所述根据用户输入的文件信息,提取对应的文件的包含关系图,包括:根据用户输入的文件信息在图数据库中找到对应的文件节点;在图数据库中找到与该文件节点相连的文件-文件边,并找到每条边指向的文件节点;输出由文件节点和文件-文件边形成的子图;
作为本发明的一种优选方式,所述根据用户输入的依赖文件和被依赖文件信息,提取依赖文件与被依赖文件之间的依赖关系图,包括:根据用户输入的依赖文件信息和被依赖文件信息在图数据库中找到对应的依赖文件节点和被依赖文件节点;在图数据库中找到与该依赖文件节点相连的文件-引用边,并找到每条边指向的引用节点;在图数据库中找到与所有引用节点相连的引用-文件边,并找到每条边指向的文件节点;对于每条文件-引用边,如果该边指向的文件节点为被依赖节点,那么保留该边;输出由文件节点、引用节点、文件-引用边和引用-文件边形成的子图。
为实现上述目的,发明人还提供了一种C语言项目依赖信息管理和可视化的系统,其特征在于,包括:信息提取模块,用于分析单个C语言文件,提取其中的符号信息和引用信息;关系型数据库管理模块,用于初始化关系型数据库,创建关系型数据库中的表结构,合并单个文件的信息并向关系型数据库写入合并后的信息,基于用户输入对关系型数据库进行查询,从而输出多种依赖关系结果;图数据库管理及可视化模块,用于初始化图数据库,基于关系型数据库中的依赖信息创建图数据库中的节点和边,基于用户输入对图数据库进行查询,从而输出多种可视化的依赖子图。
区别于现有技术,上述技术方案所达到的有益效果有:
(1)与现有技术相比,本技术能够管理C语言中更多样的依赖关系,包括多种类型的符号信息和引用信息,以及基于符号信息和引用信息提取出的多种更加抽象的依赖信息;
(2)与现有技术相比,本技术能够生成更多种类的可视化的依赖关系图;
(3)与现有技术相比,本技术针对C语言中的符号设计了一种结构化的全限定名,并能够有效地为C语言符号生成该全限定名,该全限定名可以唯一的标识代码中的每个不同的符号,用于区分不同符号主体;
(4)与现有技术相比,本技术能够有效合并C语言项目中的重复依赖信息,并且使用sid,refid,fid三种编号作为主键和外键,有效减少了储存信息的规模;
(5)本技术基于关系型数据库,信息存储更加稳定可靠,信息访问更加高效,并且基于关系型数据库能够天然支持并发访问、事务处理、故障恢复等技术;
(6)本技术基于图数据库,能够快速查询并显示依赖子图,同时基于图数据库可以稳定的显示较大规模的图结构,天然支持对图的缩放、节点位置的调整等功能;
(7)本技术可实现对大型项目依赖信息的管理和可视化。
附图说明
图1为具体实施方式所述的一种C语言项目依赖信息管理和可视化的方法的流程图;
图2为具体实施方式所述关系型数据库的表结构及约束关系的示意图;
图3为具体实施方式所述输出的可视化的符号的定义-使用关系图;
图4为具体实施方式所述输出的可视化的符号间的依赖关系图;
图5为具体实施方式所述输出的可视化的文件包含关系图;
图6为具体实施方式所述输出的可视化的依赖文件与被依赖文件之间的依赖关系图;
图7为具体实施方式所述一种C语言项目依赖信息管理和可视化的系统。
附图标记说明:
101、信息提取模块;
102、关系型数据库管理模块;
103、图数据库管理及可视化模块。
具体实施方式
为详细说明技术方案的技术内容、构造特征、所实现目的及效果,以下结合具体实施例并配合附图详予说明。
如图1所示,本实施例提供了一种C语言项目依赖信息管理和可视化的方法的流程图,该流程具有以下步骤:
步骤M1:提取项目中单个C语言文件的信息;
步骤M2:将每个文件提取到的信息合并保存到关系型数据库中;
步骤M3:基于关系型数据库,根据用户的查询提供多种依赖关系结果;
步骤M4:获取依赖图信息并保存至图数据库;
步骤M5:基于图数据库,根据用户的查询提供多种可视化的依赖关系图。
具体的,步骤M1:提取项目中单个C语言文件的信息。对单个C语言文件提取的信息主要包括符号信息和引用信息。
在根据实施例阐述本步骤的实施方式之前,首先阐述本方法中出现的两个重要概念:符号和引用。
所述符号,是指满足一定要求的字符串,用于命名编程语言中的实体(entities),可以用作标识符(identifiers)。在C语言中,一个符号可以表示的实体种类包括宏、函数、变量、类型等。
所述引用,定义为在代码中某个符号的出现,即对一个符号的使用,举例来说,在C语言中,对于一个变量类型的符号,它的每次定义、使用都称为一次引用。
实施例的C语言代码为:
对于一个C语言项目,我们首先要获取该项目的编译指令集,即compile_commands.json文件,该文件使用json格式组织信息,包含该项目的某次编译所执行的全部编译指令,每条编译指令包含指令参数,执行目录,源代码文件。从编译指令集中筛选出源代码文件为C语言编写的编译指令子集,我们可以知道项目中有哪些有待分析的C语言源文件,以及每个文件对应的编译指令。
在本实施例中,该C语言项目包含3个C语言源代码文件:main.c,header.h和helper.c。在具体实施时,本实施例使用cmake工具进行构建并生成对应的编译指令集compile_commands.json文件。通过分析编译指令集,获得了该项目中的两个待分析的C语言源文件:main.c,helper.c。
在本实施例中,所述步骤M1:提取项目中单个C语言文件的信息,可通过以下步骤实现:
步骤(1-1):提取单个C语言文件中的符号信息。对C语言文件中出现的每个符号,提取该符号的全限定名、符号类型。符号类型包括函数符号、变量符号、宏符号、类型(struct、enum、union、typedef)符号,文件符号。
在本实施例中,符号的全限定名,包括:文件名,符号名,偏移量,限定符,分隔符。文件名指该符号的定义所在的文件路径;偏移量为该符号的定义位置相对于文件开头的偏移字符数;限定符为标识该局部符号所在的局部命名空间的其他符号的符号名;分隔符包括正斜杠分隔符(/),双冒号分隔符(::),#分隔符,@分隔符。文件名与限定符、文件名与符号名、偏移量与限定符、偏移量与符号名之间用正斜杠分隔符(/)隔开;限定符与限定符、限定符与符号名之间用双冒号分隔符(::)隔开;文件名与偏移量之间用@分隔符隔开,#,@分隔符还可能出现在符号名之前,用于标识符号的类型。
在本实施例中,提取项目中待分析C语言源文件的符号的全限定名,可通过以下几个步骤实现:
步骤(1-1-1):提取函数符号的全限定名,函数的全限定名没有限定符,格式为:“文件名/函数名”。文件名是指函数定义所在的文件名,如果未找到函数定义,那么没有文件名和正斜杠分隔符。
在本实施例中,main.c的第11行有以下代码片段:
num+=pointabs(point);
其中出现了函数类型的符号pointabs,由于C语言支持分开编译,后链接,因此在该编译单元中未找到pointabs符号的定义,因此该符号的全限定名为pointabs。
步骤(1-1-2):提取变量符号的全限定名。全局变量的全限定名没有限定符,格式为“文件名/变量名”。局部变量的全限定名存在限定符,格式为“文件名@偏移量/限定符::变量名”。其中,如果该局部变量定义在一个嵌套的命名空间中,“限定符::”可重复多次。文件名和偏移量是指变量定义所在的文件名和位置,如果未找变量定义,那么没有文件名,偏移量,@分隔符和正斜杠分隔符。函数的参数视为定义在该函数命名空间中的局部变量,结构体、联合体和枚举型中的成员视为定义在该类型命名空间中的局部变量。
使用偏移量的原因是,局部变量可能在局部作用域中定义多个同名的变量符号,所以需要使用偏移量区分这些局部作用域中的局部符号。
在本实施例中,main.c的第8行和第10行具有相同的代码片段:
Int j=2;
这两处定义的局部变量具有相同的命名空间,相同的符号名,但是这两个定义的局部变量属于不同的符号,因此需要额外使用偏移量来区分。对于第8行定义的符号,它的定义位置相对与main.c文件起始位置的偏移量为120,因此该符号的全限定名为”main.c@120/main::j”。对于第10行定义的符号,它的定义位置相对与main.c文件起始位置的偏移量为151,因此该符号的全限定名为”main.c@151/main::j”。
步骤(1-1-3):提取宏符号的全限定名。宏符号的全限定名格式为“#宏符号名”。
因为宏符号拥有独立的命名空间,#分隔符用于表示该符号是宏类型。
在本实施例中,header.h的第1行有以下代码片段:
#define MAX_LIMIT 256
其中出现了宏类型的符号MAX_LIMIT,该符号的全限定名为#MAX_LIMIT。
步骤(1-1-4):提取类型(struct、enum、union、typedef)符号的全限定名。全局类型的全限定名格式为“文件名/限定符::类型名”。对于结构体、联合体和枚举型,类型名前固定有一组限定符和双冒号分隔符,分别是“struct::”、“union::”、“enum::”。因为这三种类型的符号属于同一命名空间。全局类型符号的全限定名没有其他的限定符,局部类型符号的全限定名存在其他的限定符。局部类型的全限定名格式为“文件名@偏移量/限定符::类型名”。其中,如果该局部类型定义在一个嵌套的命名空间中,“限定符::”可重复多次。文件名和偏移量是指该类型的定义所在的文件名和位置,如果未找类型的定义,那么没有文件名,偏移量,@分隔符和正斜杠分隔符。
使用偏移量的原因是,局部类型可能在局部作用域中定义多个同名的类型符号,所以需要使用偏移量区分这些局部作用域中的局部类型。
在本实施例中,header.h的第2~6行有以下代码片段:
其中出现了类型符号point,该符号为全局的结构体(struct)符号,因此该符号的全限定名为main.c/struct::point。
步骤(1-1-5):提取文件类型符号的全限定名。文件符号的全限定名格式为“@文件路径”。
@分隔符用于表示该符号是文件类型,该类型符号只能出现在include预处理指令中。
在本实施例中,main.c的第1行有以下代码片段:
#include“header.h”
其中出现了文件类型的符号header.h,该符号的全限定名为@header.h。
步骤(1-2):提取单个C语言文件中的引用信息。对C语言文件中出现的符号引用,提取该引用的对应符号的全限定名、所在文件,所在位置(行号和列号),引用类型。引用类型包括声明、定义、使用、宏(包含,定义、取消定义、宏展开,条件分支)。
在本实施例中,main.c的第10~12行有以下代码片段:
int j=2;
num+=pointabs(point);
point.y/=j;
其中出现了对变量符号j的两次引用,两次引用对应的两份引用信息的引用类型分别为定义,使用,所在文件均为main.c,由于两次引用的对应符号相同,因此对应符号的全限定名均为main.c@151/main::j。
步骤M2:将每个文件提取到的信息合并保存到关系型数据库中。在本实施例中,可通过以下几个步骤实现:
步骤(2-1):新建关系型数据库和表。初始化关系型数据库,创建SymbolTable,ReferenceTable、FileTable三张空表,分别存储符号信息,引用信息,文件的路径,三张表均使用自增的主键,分别称为sid,refid,fid。本发明实施例中关系型数据库的表结构及约束关系的示意图如图2所示。
在本实施例中,使用MySQL作为关系型数据库软件,通过MySQL支持的SQL语言来新建数据库,在该数据库中创建三张表的结构。具体来说,SymbolTable中使用sid作为主键;ReferenceTable中使用refid作为主键,sid和fid作为外键;FileTable中使用fid作为主键。
步骤(2-2):合并文件信息。将项目中分析过的C语言文件的信息添加到FileTable。对出现在引用信息中的每个文件,如果该文件的完整路径不在FileTable中,将该文件的路径存入FileTable。
步骤(2-3):合并符号信息。对于每个文件中的每个符号信息,如果SymbolTable中不存在全限定名与该符号的全限定名相同的数据,那么将该符号信息存入SymbolTable。
步骤(2-4):合并引用信息。对于每个文件中的每个引用信息,如果ReferenceTable中不存在所在文件、所在位置、引用符号的全限定名与该引用的对应信息完全相同的数据,那么在SymbolTable中通过对应符号的全限定名获得sid,将该引用信息中引用符号的全限定名替换为sid;在FileTable中通过文件路径获得fid,将该引用信息中引用符号的所在文件替换为fid,将修改过的引用信息存入RefTable。
步骤(2-5):修正符号信息。对于SymbolTable中的符号信息,如果存在一个符号A的全限定名不含文件名,另一个符号B的全限定名去除文件名后与A符号的全限定名完全相同,将ReferenceTable中sid对应为符号A的数据全部改为与B符号对应,并删除SymbolTable中A符号的记录。
在本实施例中,main.c的第11行有以下代码片段:
num+=pointabs(point);
其中出现了函数类型的符号pointabs,由于C语言支持分开编译,后链接,因此在该编译单元中未找到pointabs符号的定义,因此该符号的全限定名为pointabs。
在本实施例中,helper.c的第3~6行有以下代码片段:
该函数符号pointabs存在定义,全限定名为helper.c/pointabs。
全限定名为pointabs的符号与全限定名为helper.c/pointabs的符号除了文件名部分完全相同,因此我们将全限定名为pointabs的符号删除,同时将ReferenceTable中使用全限定名为pointabs的符号的sid的数据,全部更正为全限定名为helper.c/pointabs的符号的sid。
步骤M3:基于关系型数据库,根据用户的查询提供多种依赖关系结果。在本实施例中,基于关系型数据库中的已有的信息,可以进一步查询多种类型的、更加抽象的项目中的依赖信息。在本实施例中,可通过以下几个步骤实现:
步骤(3-1):根据用户输入的引用信息,提取对应的符号的定义-使用关系。在本实施例中,可通过以下几个步骤实现:
步骤(3-1-1):根据用户输入的引用信息,在ReferenceTable中查找到对应信息,获得该引用对应符号的sid。
步骤(3-1-2):根据sid在SymbolTable中查找到该符号的全限定名、符号类型信息。
步骤(3-1-3):根据sid在ReferenceTable中查找到所有该符号的引用记录,其中包括定义、声明、使用等多种类型的引用,在使用类型的引用与声明、定义类型的引用建立定义-使用关系。
步骤(3-1-4):输出该符号的信息以及对应的定义-使用依赖关系。
在本实施例中,用户输入的引用信息为出现在main.c文件的第11行第17列的对num符号的一处引用,那么通过该引用信息在ReferenceTable中获得对应的记录,并获得该记录中的sid。使用该sid在SymbolTable中查找到该符号为变量,全限定名为helper.c/num。接着使用该sid在ReferenceTable中查找引用记录,在本实施例中,查找到的使用类型的引用记录即为用户输入的引用信息,查找到的定义类型的引用记录出现在helper.c文件的第2行第5列,查找到的声明类型的引用记录出现在header.h文件中的第6行第12列。
在本实施例中,根据该输入信息,最终输出的结果包括helper.c/num的符号信息,该变量的定义的引用信息和该变量的声明的引用信息。这样,用户根据一次符号的使用,就可以便捷地找到该符号的定义和声明。
步骤(3-2):根据用户输入的符号信息,提取对应符号与其他符号依赖关系。在本实施例中,可通过以下几个步骤实现:
步骤(3-2-1):根据用户输入的符号信息,在SymbolTable中获得该符号的sid。
步骤(3-2-2):在ReferenceTable中使用sid查找到该符号对应的定义类型引用和声明类型引用。
步骤(3-2-3):对每个该符号的定义引用和声明引用,在ReferenceTable中查找到使用位置位于定义体和声明中的引用信息。
步骤(3-2-4):对于步骤(3-2-3中获得的每个引用信息,使用sid从SymbolTable中获得该符号的信息。
步骤(3-2-5):在用户查询的符号与从步骤(3-2-4)中获得的每个符号之间建立符号依赖关系并输出。
在本实施例中,用户输入的符号信息为全限定名为helper.c/pointabs的符号,根据该全限定名在SymbolTable中找到对应的记录并获得sid,通过分析ReferenceTable中位置在该函数定义体内的引用信息,最终输出全限定名为helper.c/pointabs的符号所依赖的符号包括:全限定名为main.c/struct::point的类型(struct)符号。
步骤(3-3):根据用户输入的文件信息,提取对应文件的文件包含关系。在本实施例中,可通过以下几个步骤实现:
步骤(3-3-1):根据用户输入的文件信息,在FileTable中获得该文件的fid。
步骤(3-3-2):根据fid在ReferenceTable中查找到所有该文件中的包含类型的引用信息。
步骤(3-3-3):对于步骤(3-3-2)中获得的每个引用信息,获得该引用对应的符号的sid,根据sid在SymbolTable中查找该符号的全限定名。根据文件类型的全限定名格式,去除开头的@分隔符即可得到文件路径。
步骤(3-3-4):对于步骤(3-3-3)中获得的每个文件路径,在FileTable中获得对应的文件信息。
步骤(3-3-5):在用户查询的文件与从步骤(3-3-4)中获得的每个文件之间建立文件包含关系并输出。
在本实施例中,用户输入的文件信息为helper.c,通过查询FileTable获得该文件的fid,通过查询ReferenceTable,找到该fid对应的引用信息中包含一条包含类型的引用信息,该引用信息对应的符号的全限定名为@header.h,去除@分隔符后获得文件名为header.h。最终输出helper.c包含的文件包括:header.h。
步骤(3-4):根据用户输入的文件信息,提取对应文件与其他文件之间的依赖关系。在本实施例中,可通过以下几个步骤实现:
步骤(3-4-1):根据用户输入的文件信息,在FileTable中获得该文件的fid。
步骤(3-4-2):根据fid在ReferenceTable中查找到所有该文件中的使用类型的引用信息。
步骤(3-4-3):对于步骤(3-4-2)中获得的每个引用信息,获得该引用对应的符号的sid,根据sid在ReferenceTable中查找该符号的定义类型引用和声明类型引用。
步骤(3-4-4):对于步骤(3-4-3)中获得的每个引用信息,获得该引用对应的fid,根据fid在FileTable中找到对应的文件信息。
步骤(3-4-5):在用户查询的文件与从步骤(3-4-4)中获得的每个文件之间建立文件依赖关系并输出。
在本实施例中,用户输入的文件信息为helper.c,通过查询FileTable获得该文件的fid,通过查询ReferenceTable得到该fid对应的全部引用信息。包括:位于第1行第11列的包含类型的引用,位于第2行第5列的定义类型的引用,位于第3行第5列的定义类型的引用,位于第3行第14列的使用类型的引用。最终仅在位于第3行第14列的引用中找到了位于其他文件的定义引用,fid对应的文件名为header.c;其他引用的定义引用和声明引用均在helper.c本文件中。最终输出helper.c依赖的文件包括:header.c。
步骤M4:获取依赖图信息并保存至图数据库。在本实施例中,基于关系型数据库中的信息,在图数据库中创建异构的依赖图结构。具体的可通过以下几个步骤实现:
步骤(4-1):新建图数据库,初始化图节点。初始化关系型数据库,图中包含符号、引用、文件三种类型的节点,对每个节点上的信息,使用关系型数据库中SymbolTable,ReferenceTable,FileTable对应的符号信息,引用信息,文件信息。
步骤(4-2):在图节点间构建文件间依赖关系子图。基于关系型数据库对每个文件提取文件间的依赖关系,然后构建该子图;该子图包含两种类型的边:文件-引用边和引用-文件边,文件-引用边由文件节点指向引用节点,表示使用关系,即该文件存在这个引用,引用-文件边由引用节点指向文件节点,表示定位关系,即该引用对应的符号的定义/声明位于这个文件,文件节点和文件节点之间通过引用节点间接地连接在一起,表示文件之间的依赖关系。
步骤(4-3):在图节点间中构建文件的包含关系子图。基于关系型数据库对每个文件提取包含关系,然后构建该子图。该子图包含文件-文件边,由文件节点指向文件节点,表示文件之间的直接包含关系。
步骤(4-4):在图节点间构建符号间依赖关系子图。基于关系型数据库对每个符号提取符号间的依赖关系,然后构建该子图。该子图包含符号-符号边,由符号节点指向符号节点,表示符号之间的依赖关系。
步骤(4-5):在图节点间构建符号的定义-使用关系子图。基于关系型数据库对每个符号提取该符号的定义-使用关系,然后构建该子图。该子图包含符号-引用边,由符号节点指向引用节点,表示该符号拥有这个引用信息,即引用的是该符号。在与该符号相连的所有引用节点中,使用类型的引用节点和定义/声明类型的引用节点表示该符号的定义-使用关系。
在本实施例中,使用Neo4j作为图数据库软件,通过Neo4j支持的CQL语言来新建数据库,在该数据库中创建三张表的结构。具体来说,符号类型的节点上的信息包括:sid,符号名,符号的全限定名,符号类型;引用类型的节点上的信息包括:refid,引用的符号的符号名,引用类型,所在位置;文件类型的节点上的信息包括:fid,文件路径。
在本实施例中,通过分步骤地构建包含不同边的依赖子图,实质上在Neo4j图数据库中构成了对实施例中C语言项目的一张完整的异构的依赖图,后续输出的多种可视化的依赖关系图就是对该完整的依赖图按条件筛选节点和边后得到的子图。
步骤M5:基于图数据库,根据用户的查询提供多种可视化的依赖关系图。
在本实施例中,输出的多种可视化的依赖关系图就是对步骤M4中生成的完整的依赖图按条件筛选节点和边后得到的子图。在本实施例中,可通过以下几个步骤实现:
步骤(5-1):根据用户输入的符号信息,提取对应的符号的定义-使用关系图。在本实施例中,可通过以下几个步骤实现:根据用户输入的符号信息在图数据库中找到对应的符号节点;在图数据库中找到与该符号节点相连的符号-引用边,并找到每条边指向的引用节点;输出由符号节点、引用节点和符号-引用边形成的子图。
在本实施例中,用户输入查询的符号名为num,根据图数据库中节点上的符号名信息进行比对,找到该符号节点,找到与它相连的符号-引用边,并输出可视化的num符号的定义-使用关系图,如图3所示。与该符号节点相连的使用类型的引用节点与声明/定义类型的引用节点之间实际上构成了定义-使用关系;在本实施例中,图数据库中命名该类型的边为symbolref;图数据库中命名该类型的引用节点为Reference;图数据库中命名该两种类型的引用节点为Declaration/Definition。
在本实施例中,由于num符号的不同类型的引用节点位于不同的文件中,因此还额外显示了文件节点和引用-文件边;在本实施例中,图数据库中命名该类型的边为located_in。
步骤(5-2):根据用户输入的符号信息,提取对应的符号间依赖关系图。在本实施例中,可通过以下几个步骤实现:根据用户输入的符号信息在图数据库中找到对应的符号节点;在图数据库中找到与该符号节点相连的符号-符号边,并找到每条边指向的符号节点;输出由符号节点和符号-符号边形成的子图。
在本实施例中,用户输入查询的符号名为pointabs,根据图数据库中节点上的符号名信息进行比对,找到该符号节点,找到与它相连的符号-符号边,并输出可视化的pointsabs符号与其他符号间的依赖关系图,如图4所示。在本实施例中,图数据库中命名该类型的边为symboldep。
步骤(5-3):根据用户输入的文件信息,提取对应的文件的包含关系图。在本实施例中,可通过以下几个步骤实现:根据用户输入的文件信息在图数据库中找到对应的文件节点;在图数据库中找到与该文件节点相连的文件-文件边,并找到每条边指向的文件节点;输出由文件节点和文件-文件边形成的子图。
在本实施例中,用户输入查询的文件名为main.c,根据图数据库中节点上的文件名信息进行比对,找到该文件节点,找到与它相连的文件-文件边,并输出可视化的main.c文件与其他文件间的包含关系图,如图5所示。在本实施例中,图数据库中命名该类型的边为include。
步骤(5-4):根据用户输入的依赖文件和被依赖文件信息,提取依赖文件与被依赖文件之间的依赖关系图。在本实施例中,可通过以下几个步骤实现:根据用户输入的依赖文件信息和被依赖文件信息在图数据库中找到对应的依赖文件节点和被依赖文件节点;在图数据库中找到与该依赖文件节点相连的文件-引用边,并找到每条边指向的引用节点;对找到的每个文件-引用边指向的引用节点,在图数据库中找到与该引用节点相连的引用-文件边,并找到每条边指向的文件节点;对于每条文件-引用边,如果该边指向的文件节点为被依赖节点,那么保留该边;输出由文件节点、引用节点、文件-引用边和引用-文件边形成的子图。
在本实施例中,用户输入的依赖文件为main.c,被依赖文件为header.h,首先输入文件找到对应的两个文件节点,然后找到与main.c节点通过文件-引用边相连的引用节点,在本实施例中,图数据库中命名该类型的边为use;然后对每个找到的引用节点,保留与header.h通过引用-文件边相连的引用节点,在本实施例中,图数据库中命名该类型的边为located_in;并输出可视化的main.c文件对header.h的依赖关系图,如图6所示。
在上述实施例的图3至图6中,不同表达形状代表不同节点类型,同一形状代表同一节点类型。
如图7所示,本实施例还提供了一种C语言项目依赖信息管理和可视化的装置,在本实施例中,该装置用于具体完成对实施例中C语言项目中依赖信息的管理和可视化功能。该装置具有以下模块:
信息提取模块101,用于分析单个C语言文件,提取其中的符号信息和引用信息。关系型数据库管理模块102,用于初始化关系型数据库,创建关系型数据库中的表结构,合并单个文件的信息并向关系型数据库写入合并后的信息,基于用户输入对关系型数据库进行查询,从而输出多种依赖关系结果。图数据库管理及可视化模块103,用于初始化图数据库,基于关系型数据库中的依赖信息创建图数据库中的节点和边,基于用户输入对图数据库进行查询,从而输出多种可视化的依赖子图。
需要说明的是,尽管在本文中已经对上述各实施例进行了描述,但并非因此限制本发明的专利保护范围。因此,基于本发明的创新理念,对本文所述实施例进行的变更和修改,或利用本发明说明书及附图内容所作的等效结构或等效流程变换,直接或间接地将以上技术方案运用在其他相关的技术领域,均包括在本发明的专利保护范围之内。
Claims (8)
1.一种C语言项目依赖信息管理和可视化的方法,其特征在于,包括:
提取项目中单个C语言文件的信息;
将每个文件提取到的信息合并保存到关系型数据库中;
基于关系型数据库,根据用户的查询提供多种依赖关系结果;
获取依赖图信息并保存至图数据库;
基于图数据库,根据用户的查询提供多种可视化的依赖关系图;
所述提取项目中单个C语言文件的信息,包括:
提取单个C语言文件中的符号信息,对C语言文件中出现的每个符号,提取该符号的全限定名、符号类型,所述符号类型包括函数符号、变量符号、宏符号、类型符号和文件符号;
提取单个C语言文件中的引用信息,对C语言文件中出现的符号引用,提取该引用的对应符号的全限定名、所在文件、所在位置和引用类型,所述所在位置包括行号和列号,所述引用类型包括声明、定义、使用和宏,所述宏包含定义、取消定义、宏展开和条件分支;
所述将每个文件提取到的信息合并保存到关系型数据库中,包括:
新建关系型数据库和表,初始化关系型数据库,创建SymbolTable,ReferenceTable、FileTable三张空表,分别存储符号信息、引用信息和文件的路径,三张表均使用自增的主键,分别称为sid,refid,fid;
合并文件信息,将项目中分析过的C语言文件的信息添加到FileTable,对出现在引用信息中的每个文件,如果该文件的完整路径不在FileTable中,将该文件的路径存入FileTable;
合并符号信息,对于每个文件中的每个符号信息,如果SymbolTable中不存在全限定名与该符号的全限定名相同的数据,则将该符号信息存入SymbolTable;
合并引用信息,对于每个文件中的每个引用信息,如果ReferenceTable中不存在所在文件、所在位置、引用符号的全限定名与该引用的对应信息完全相同的数据,则在SymbolTable中通过对应符号的全限定名获得sid,将该引用信息中引用符号的全限定名替换为sid;在FileTable中通过文件路径获得fid,将该引用信息中引用符号的所在文件替换为fid,将修改过的引用信息存入ReferenceTable;
修正符号信息,对于SymbolTable中的符号信息,如果存在一个符号A的全限定名不含文件名,另一个符号B的全限定名去除文件名后与A符号的全限定名完全相同,将ReferenceTable中sid对应为符号A的数据全部改为与B符号对应,并删除SymbolTable中A符号的记录。
2.根据权利要求1所述的一种C语言项目依赖信息管理和可视化的方法,其特征在于:
所述符号的全限定名包括文件名、符号名、偏移量、限定符和分隔符,所述文件名指该符号的定义所在的文件路径,所述偏移量为该符号的定义位置相对于文件开头的偏移字符数,所述限定符为标识局部符号所在的局部命名空间的其他符号的符号名,所述分隔符包括正斜杠分隔符、双冒号分隔符、#分隔符和@分隔符,其中:文件名与限定符、文件名与符号名、偏移量与限定符、偏移量与符号名之间用正斜杠分隔符隔开,限定符与限定符、限定符与符号名之间用双冒号分隔符隔开,文件名与偏移量之间用@分隔符隔开,#分隔符、@分隔符还出现在符号名之前,用于标识符号的类型;
提取符号的全限定名,包括:
提取函数符号的全限定名,格式为“文件名/函数名”,文件名是指函数定义所在的文件名,如果未找到函数定义,则没有文件名和正斜杠分隔符;
提取变量符号的全限定名,所述变量包括全局变量和局部变量,全局变量的全限定名格式为“文件名/变量名”,局部变量的全限定名格式为“文件名@偏移量/限定符::变量名”,其中,如果该局部变量定义在一个嵌套的命名空间中,“限定符::”可重复多次,文件名和偏移量是指变量定义所在的文件名和位置,如果未找到变量定义,则没有文件名、偏移量、@分隔符和正斜杠分隔符,函数的参数视为定义在该函数命名空间中的局部变量,结构体、联合体和枚举型中的成员视为定义在该类型命名空间中的局部变量;
提取宏符号的全限定名,宏符号的全限定名格式为“#宏符号名”;
提取类型符号的全限定名,全局类型的全限定名格式为“文件名/限定符::类型名”,对于结构体、联合体和枚举型,类型名前固定有一组限定符和双冒号分隔符,分别是“struct::”、“union::”、“enum::”,全局类型符号的全限定名没有其他的限定符,局部类型符号的全限定名存在其他的限定符,局部类型的全限定名格式为“文件名@偏移量/限定符::类型名”,其中,如果该局部类型定义在一个嵌套的命名空间中,“限定符::”可重复多次,文件名和偏移量是指该类型的定义所在的文件名和位置,如果未找到类型的定义,则没有文件名、偏移量、@分隔符和正斜杠分隔符;
提取文件类型符号的全限定名,文件符号的全限定名格式为“@文件路径”。
3.根据权利要求1所述的一种C语言项目依赖信息管理和可视化的方法,其特征在于,所述基于关系型数据库,根据用户的查询提供多种依赖关系结果,包括:
根据用户输入的引用信息,提取对应的符号的定义-使用关系;
根据用户输入的符号信息,提取对应符号与其他符号依赖关系;
根据用户输入的文件信息,提取对应文件的文件包含关系;
根据用户输入的文件信息,提取对应文件与其他文件之间的依赖关系。
4.根据权利要求3所述的一种C语言项目依赖信息管理和可视化的方法,其特征在于:
所述根据用户输入的引用信息,提取对应的符号的定义-使用关系,包括:根据用户输入的引用信息,在ReferenceTable中查找到对应信息,获得该引用对应符号的sid;根据sid在SymbolTable中查找到该符号的全限定名、符号类型信息;根据sid在ReferenceTable中查找到所有该符号的引用记录,其中包括定义、声明和使用多种类型的引用,在使用类型的引用与声明、定义类型的引用建立定义-使用关系;输出该符号的信息以及对应的定义-使用依赖关系;
所述根据用户输入的符号信息,提取对应符号与其他符号依赖关系,包括:根据用户输入的符号信息,在SymbolTable中获得该符号的sid;在ReferenceTable中使用sid查找到该符号对应的定义类型引用和声明类型引用;对每个该符号的定义引用和声明引用,在ReferenceTable中查找到使用位置位于定义体和声明中的引用信息;对于获得的每个引用信息,使用sid从SymbolTable中获得该符号的信息;在用户查询的符号与获得的每个符号之间建立符号依赖关系并输出;
所述根据用户输入的文件信息,提取对应文件的文件包含关系,包括:根据用户输入的文件信息,在FileTable中获得该文件的fid;根据fid在ReferenceTable中查找到所有该文件中的包含类型的引用信息;对于获得的每个引用信息,获得该引用对应的符号的sid,根据sid在SymbolTable中查找该符号的全限定名,根据文件类型的全限定名格式,去除开头的@分隔符得到文件路径;对于获得的每个文件路径,在FileTable中获得对应的文件信息;在用户查询的文件与获得的每个文件之间建立文件包含关系并输出;
所述根据用户输入的文件信息,提取对应文件与其他文件之间的依赖关系,包括:根据用户输入的文件信息,在FileTable中获得该文件的fid;根据fid在ReferenceTable中查找到所有该文件中的使用类型的引用信息;对于获得的每个引用信息,获得该引用对应的符号的sid,根据sid在ReferenceTable中查找该符号的定义类型引用和声明类型引用;对于获得的每个定义类型引用和声明类型引用的信息,获得该引用对应的fid,根据fid在FileTable中找到对应的文件信息;在用户查询的文件与获得的每个文件之间建立文件依赖关系并输出。
5.根据权利要求1所述的一种C语言项目依赖信息管理和可视化的方法,其特征在于,所述获取依赖图信息并保存至图数据库,包括:
新建图数据库、初始化图节点、初始化关系型数据库,图中包含符号、引用、文件三种类型的节点,对每个节点上的信息,使用关系型数据库中SymbolTable,ReferenceTable,FileTable对应的符号信息、引用信息和文件信息;
在图节点间构建文件间依赖关系子图,基于关系型数据库对每个文件提取文件间的依赖关系,然后构建该子图,该子图包含两种类型的边:文件-引用边和引用-文件边,文件-引用边由文件节点指向引用节点,表示使用关系,即该文件存在这个引用,引用-文件边由引用节点指向文件节点,表示定位关系,即该引用对应的符号的定义/声明位于这个文件,文件节点和文件节点之间通过引用节点间接地连接在一起,表示文件之间的依赖关系;
在图节点间中构建文件的包含关系子图,基于关系型数据库对每个文件提取包含关系,然后构建该子图,该子图包含文件-文件边,由文件节点指向文件节点,表示文件之间的直接包含关系;
在图节点间构建符号间依赖关系子图,基于关系型数据库对每个符号提取符号间的依赖关系,然后构建该子图,该子图包含符号-符号边,由符号节点指向符号节点,表示符号之间的依赖关系;
在图节点间构建符号的定义-使用关系子图,基于关系型数据库对每个符号提取该符号的定义-使用关系,然后构建该子图,该子图包含符号-引用边,由符号节点指向引用节点,表示该符号拥有这个引用信息,即引用的是该符号,在与该符号相连的所有引用节点中,使用类型的引用节点和定义/声明类型的引用节点表示该符号的定义-使用关系。
6.根据权利要求1所述的一种C语言项目依赖信息管理和可视化的方法,其特征在于,所述基于图数据库,根据用户的查询提供多种可视化的依赖关系图,包括:
根据用户输入的符号信息,提取对应的符号的定义-使用关系图;
根据用户输入的符号信息,提取对应的符号间依赖关系图;
根据用户输入的文件信息,提取对应的文件的包含关系图;
根据用户输入的依赖文件和被依赖文件信息,提取依赖文件与被依赖文件之间的依赖关系图。
7.根据权利要求6所述的一种C语言项目依赖信息管理和可视化的方法,其特征在于:
所述根据用户输入的符号信息,提取对应的符号的定义-使用关系图,包括:根据用户输入的符号信息在图数据库中找到对应的符号节点;在图数据库中找到与该符号节点相连的符号-引用边,并找到每条边指向的引用节点;输出由符号节点、引用节点和符号-引用边形成的子图;
所述根据用户输入的符号信息,提取对应的符号间依赖关系图,包括:根据用户输入的符号信息在图数据库中找到对应的符号节点;在图数据库中找到与该符号节点相连的符号-符号边,并找到每条边指向的符号节点;输出由符号节点和符号-符号边形成的子图;
所述根据用户输入的文件信息,提取对应的文件的包含关系图,包括:根据用户输入的文件信息在图数据库中找到对应的文件节点;在图数据库中找到与该文件节点相连的文件-文件边,并找到每条边指向的文件节点;输出由文件节点和文件-文件边形成的子图;
所述根据用户输入的依赖文件和被依赖文件信息,提取依赖文件与被依赖文件之间的依赖关系图,包括:根据用户输入的依赖文件信息和被依赖文件信息在图数据库中找到对应的依赖文件节点和被依赖文件节点;在图数据库中找到与该依赖文件节点相连的文件-引用边,并找到每条边指向的引用节点;在图数据库中找到与所有引用节点相连的引用-文件边,并找到每条边指向的文件节点;对于每条文件-引用边,如果该边指向的文件节点为被依赖节点,则保留该边;输出由文件节点、引用节点、文件-引用边和引用-文件边形成的子图。
8.一种C语言项目依赖信息管理和可视化的系统,其特征在于,该系统使用了上述权利要求1至7任意一项所述的C语言项目依赖信息管理和可视化的方法,还包括:
信息提取模块,用于分析单个C语言文件,提取其中的符号信息和引用信息;
关系型数据库管理模块,用于初始化关系型数据库,创建关系型数据库中的表结构,合并单个文件的信息并向关系型数据库写入合并后的信息,基于用户输入对关系型数据库进行查询,从而输出多种依赖关系结果;
图数据库管理及可视化模块,用于初始化图数据库,基于关系型数据库中的依赖信息创建图数据库中的节点和边,基于用户输入对图数据库进行查询,从而输出多种可视化的依赖子图。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110696402.XA CN113448553B (zh) | 2021-06-23 | 2021-06-23 | 一种c语言项目依赖信息管理和可视化的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110696402.XA CN113448553B (zh) | 2021-06-23 | 2021-06-23 | 一种c语言项目依赖信息管理和可视化的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113448553A CN113448553A (zh) | 2021-09-28 |
CN113448553B true CN113448553B (zh) | 2023-11-03 |
Family
ID=77812191
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110696402.XA Active CN113448553B (zh) | 2021-06-23 | 2021-06-23 | 一种c语言项目依赖信息管理和可视化的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113448553B (zh) |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7174536B1 (en) * | 2001-02-12 | 2007-02-06 | Iowa State University Research Foundation, Inc. | Integrated interactive software visualization environment |
CN101650651A (zh) * | 2009-09-17 | 2010-02-17 | 浙江大学 | 一种源代码级别程序结构的可视化方法 |
CN102508689A (zh) * | 2011-11-08 | 2012-06-20 | 上海交通大学 | 高级语言程序数据流图提取中依赖关系保持数据处理系统 |
JP2013156786A (ja) * | 2012-01-30 | 2013-08-15 | Hitachi Automotive Systems Ltd | ソフトウェアの構造可視化プログラムおよびシステム |
CN106469049A (zh) * | 2015-08-19 | 2017-03-01 | 腾讯科技(深圳)有限公司 | 一种文件扫描的方法及装置 |
CN109033843A (zh) * | 2018-08-02 | 2018-12-18 | 南瑞集团有限公司 | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 |
CN109634591A (zh) * | 2018-12-29 | 2019-04-16 | 杭州迪普科技股份有限公司 | 一种文件处理方法及装置 |
CN110262803A (zh) * | 2019-06-30 | 2019-09-20 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
CN110781086A (zh) * | 2019-10-23 | 2020-02-11 | 南京大学 | 一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法 |
CN110908710A (zh) * | 2019-11-19 | 2020-03-24 | 天津大学 | 一种Web前端代码依赖关系可视化方法 |
CN111104335A (zh) * | 2019-12-25 | 2020-05-05 | 清华大学 | 一种基于多层次分析的c语言缺陷检测方法及装置 |
CN111931181A (zh) * | 2020-07-07 | 2020-11-13 | 北京理工大学 | 基于图挖掘的软件逻辑漏洞检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100082646A1 (en) * | 2008-09-26 | 2010-04-01 | Microsoft Corporation | Tracking constraints and dependencies across mapping layers |
-
2021
- 2021-06-23 CN CN202110696402.XA patent/CN113448553B/zh active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7174536B1 (en) * | 2001-02-12 | 2007-02-06 | Iowa State University Research Foundation, Inc. | Integrated interactive software visualization environment |
CN101650651A (zh) * | 2009-09-17 | 2010-02-17 | 浙江大学 | 一种源代码级别程序结构的可视化方法 |
CN102508689A (zh) * | 2011-11-08 | 2012-06-20 | 上海交通大学 | 高级语言程序数据流图提取中依赖关系保持数据处理系统 |
JP2013156786A (ja) * | 2012-01-30 | 2013-08-15 | Hitachi Automotive Systems Ltd | ソフトウェアの構造可視化プログラムおよびシステム |
CN106469049A (zh) * | 2015-08-19 | 2017-03-01 | 腾讯科技(深圳)有限公司 | 一种文件扫描的方法及装置 |
CN109033843A (zh) * | 2018-08-02 | 2018-12-18 | 南瑞集团有限公司 | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 |
CN109634591A (zh) * | 2018-12-29 | 2019-04-16 | 杭州迪普科技股份有限公司 | 一种文件处理方法及装置 |
CN110262803A (zh) * | 2019-06-30 | 2019-09-20 | 潍柴动力股份有限公司 | 一种依赖关系的生成方法及装置 |
CN110781086A (zh) * | 2019-10-23 | 2020-02-11 | 南京大学 | 一种基于程序依赖关系和符号分析的跨项目缺陷影响分析方法 |
CN110908710A (zh) * | 2019-11-19 | 2020-03-24 | 天津大学 | 一种Web前端代码依赖关系可视化方法 |
CN111104335A (zh) * | 2019-12-25 | 2020-05-05 | 清华大学 | 一种基于多层次分析的c语言缺陷检测方法及装置 |
CN111931181A (zh) * | 2020-07-07 | 2020-11-13 | 北京理工大学 | 基于图挖掘的软件逻辑漏洞检测方法 |
Non-Patent Citations (3)
Title |
---|
C语言文件间依赖性分析;黄文伟;《中国优秀硕士学位论文全文数据库 信息科技辑》(第2005年第02期);第I138-93页 * |
Variable dependency analysis of a computer program;Muhammad Sheikh Sadi;2013 International Conference on Electrical Information and Communication Technology(EICT);第1-5页 * |
面向领域的软件系统构造与质量保障专题前言;潘敏学;《软件学报》(第2021年04期);第887-888页 * |
Also Published As
Publication number | Publication date |
---|---|
CN113448553A (zh) | 2021-09-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9864590B2 (en) | Method and system for automated improvement of parallelism in program compilation | |
US8826225B2 (en) | Model transformation unit | |
CN107704382B (zh) | 面向Python的函数调用路径生成方法和系统 | |
CA2819008C (en) | Method and system for displaying selectable autocompletion suggestions and annotations in mapping tool | |
CN101887365B (zh) | 用于构造基于组件的应用的可执行代码的方法和编译器 | |
Ebert et al. | Gupro-generic understanding of programs an overview | |
WO2021073195A1 (zh) | 生成电子表格公式的计算机实现的方法、设备和存储介质 | |
CN105138335A (zh) | 一种基于控制流图的函数调用路径提取方法及装置 | |
CN104679511A (zh) | 基于MDE模型转换的MapReduce代码生成方法 | |
CN102222110A (zh) | 数据处理装置和数据处理方法 | |
CN113342325A (zh) | 可视化建模方法、系统、电子设备及存储介质 | |
US8914782B2 (en) | Optimization of declarative queries | |
Cordy et al. | Software engineering by source transformation-experience with TXL | |
CN113326047B (zh) | 基于静态分析的c语言代码依赖关系提取方法 | |
CN113448553B (zh) | 一种c语言项目依赖信息管理和可视化的方法及系统 | |
CN113885970B (zh) | 一种基于脚本生成报表数据的方法、系统及介质 | |
Sousa et al. | A model-driven traceability framework to software product line development | |
CN114066428A (zh) | 一种基于bpmn规范的业务流程建模方法 | |
Klatt et al. | Improving product copy consolidation by architecture-aware difference analysis | |
Bai et al. | Automatic generation of code comments based on comment reuse and program parsing | |
Jakob et al. | View creation of meta models by using modified triple graph grammars | |
Pavkovic et al. | A UML-based approach to forward engineering of SQLite database | |
CN117743439A (zh) | 目标数据的关系获取方法及其装置、电子设备 | |
Annotations | Enabling the Reuse of Stored Model Transformations Through Annotations | |
CN115756588A (zh) | 一种基于Swagger的API文档管理系统及方法 |
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 |