CN115599440A - Go语言软件中CGO语言特征的自动识别方法及存储介质 - Google Patents
Go语言软件中CGO语言特征的自动识别方法及存储介质 Download PDFInfo
- Publication number
- CN115599440A CN115599440A CN202211180372.8A CN202211180372A CN115599440A CN 115599440 A CN115599440 A CN 115599440A CN 202211180372 A CN202211180372 A CN 202211180372A CN 115599440 A CN115599440 A CN 115599440A
- Authority
- CN
- China
- Prior art keywords
- cgo
- language
- ast
- node
- features
- 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.)
- Pending
Links
Images
Classifications
-
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明的一种Go语言软件中CGO语言特征的自动识别方法及存储介质,包括以下步骤,将Go语言代码解析成抽象语法树AST;遍历抽象语法树AST识别CGO对应的语言特征;其中,所述对应的语言特征包括CGO函数调用、导出函数、头文件、基本类型转换以及CGO机制启用。本发明能自动分析识别Go代码仓库中的CGO信息并存入数据库。本发明分析了约1000个开源Go代码仓库,对CGO语言特征的总体使用情况、使用差异以及CGO使用可能带来的安全问题进行了分析,为开发者提供了Go社区中CGO的整体使用现状并对构建可靠安全的包含CGO的Go语言程序提供参考。
Description
技术领域
本发明涉及编程语言技术领域,具体涉及一种Go语言软件中CGO语言特征的自动识别方法及存储介质。
背景技术
Go语言,又称Golang,是由Google在2007年开始设计并最终在2009年发布的一门编程语言。其语法简单,易于开发,且有垃圾回收、多返回值等高级语言特性,目前已经成为全球TOP10的编程语言。Go语言提供了一种名为CGO的跨语言互调机制,可以使得Go语言和C语言互相调用。
目前在跨语言调用方面研究者们已经有许多研究,期望提升跨语言调用的性能以及安全性。Maga D.Zandaqo在2017年提到了如何使用现代化方法在JavaScript中调用C++;Furr等人提出了一种多语言类型推断系统,能够防止外部函数调用将类型和内存安全违规引入本来安全的语言中。
目前已经有一些对不同编程语言的语言特征的研究,研究者们希望借此来发现语言特征在现有软件中的使用方式和缺陷,为进而研制提高编程语言性能和安全性的方法和工具奠定基础。2013年Dyer等人从大量的Java开源项目中研究了Java语言特征的使用情况,2018年Rodrigues等人从28个Ruby项目中分析了开发者对Ruby语言特征的使用方式。2021年Peng等人从大量Python开源项目研究了Python语言特征的提取与使用分析。
在Go和CGO的优化方面,学术界与Go社区也有许多相关的研究成果。Wang等人在2020年提出了一种针对Go编程语言的逃逸分析优化方法来节省Go程序的堆内存使用。Dgraph团体为了绕开Go的自动内存管理,提升内存管理的性能,使用jemalloc加CGO的方式在Go中构建了一套手动内存管理系统。Uber团队发现Go的GC(垃圾回收)会占用大约25%的CPU计算资源,为了减少GC的CPU占用,Uber团队设计了一个GOGC Tuner来动态调节GO GC的参数,最终节省了大约70K的CPU核心资源。
目前Go的整个社区生态中缺少对开源社区CGO使用情况的分析。当开发者尝试开发Go和C的跨语言程序时对社区中CGO的使用情况及特点尚不了解,难以从目前社区CGO的使用中获得开发指导。本发明以及分析结果可以提供Go社区中CGO的整体使用现状,并对构建可靠安全的包含CGO的Go语言程序提供参考。
发明内容
本发明提出的一种Go语言软件中CGO语言特征的自动识别方法,可至少解决背景技术反馈的一种问题。
为实现上述目的,本发明采用了以下技术方案:
一种Go语言软件中CGO语言特征的自动识别方法,包括以下步骤:
将Go语言代码解析成抽象语法树AST;
遍历抽象语法树AST识别对应的语言特征;
针对对应的语言特征分别识别。
进一步的,所述对应的语言特征包括CGO函数调用、导出函数、头文件、基本类型转换以及CGO机制启用。
进一步的,当语言特征为CGO函数调用时,识别步骤如下:
遍历Go的AST中的ImportSpec结点,判断其中是否有import“C”;
遍历Go的AST中的其余结点,判断其是否是CallExpr;
判断CallExpr结点中的Fun域是否是SelectorExpr;
判断SelectorExpr是否是C.XXX()的形式,且XXX不是C中类型名。
进一步的,当语言特征为导出函数时,识别步骤如下:
遍历Go的AST中的所有顶层结点,判断其是否是FuncDecl;
判断FuncDecl结点的Doc域中的内容是否是//export funcname的形式,其中funcname是该函数的名称。
进一步的,当语言特征为头文件时,识别步骤如下:
遍历Go的AST中的ImportSpec结点,判断其中是否有import“C”;
检查import“C”对应的ImportSpec结点的Doc域,判断其中是否包含#include<…h>或#include“…h”。其中…代表头文件名;
使用尖括号<>的头文件被分类为标准库头文件,使用双引号“”的头文件被分类为用户自定义头文件。
进一步的,当语言特征为基本类型转换时,识别步骤如下:
遍历Go的AST中的ImportSpec结点,判断其中是否有import“C”;
遍历Go的AST中的其余结点,判断其是否是CallExpr;
判断CallExpr结点中的Fun域是否是SelectorExpr;
判断SelectorExpr是否是C.XXX()的形式,且XXX是C中类型名。
进一步的,当语言特征为CGO机制启用时,识别步骤如下:
遍历仓库所有Go代码文件对应的AST;
遍历AST中的ImportSpec结点,判断其中是否有import“C”。
另一方面,本发明还公开一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如上述方法的步骤。
由上述技术方案可知,本发明的Go语言软件中CGO语言特征的自动识别方法,通过分析Go语言及CGO规范,提出Go仓库中特定CGO语言特征的识别方法和自动识别系统CGOAnalyzer。CGO涉及的语言特征包括CGO调用及其所在位置、调用次数、所调用的C函数、引用的头文件、导出的Go函数等;本发明的CGOAnalyzer能自动分析识别Go代码仓库中的CGO信息并存入数据库。本发明利用CGOAnalyzer分析了约1000个开源Go代码仓库,对CGO语言特征的总体使用情况、使用差异以及CGO使用可能带来的安全问题进行了分析,为开发者提供了Go社区中CGO的整体使用现状并对构建可靠安全的包含CGO的Go语言程序提供参考。
附图说明
图1是本发明的方法流程图;
图2a是本发明实施例CGO调用次数曲线图;
图2b是本发明实施例使用CGO的包数曲线图;
图2c是本发明实施例使用CGO的文件数曲线图;
图3是本发明实施例对应软件CGOAnalyzer的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。
如图1所示,本实施例所述的Go语言软件中CGO语言特征的自动识别方法,包括以下步骤:
将Go语言代码解析成抽象语法树AST;
遍历抽象语法树AST识别对应的语言特征;
针对对应的语言特征分别进行识别;
最后将识别的特征存入数据库。
以下分别从整体到局部以及应用的角度来说明:
本发明的主要技术内容涉及CGOAnalyzer的自动分析框架、语言特征识别(包括模式构建以及自动识别策略)以及Go语言仓库的扫描等。其中语言特征识别和存储部分是本发明的关键技术。
首先介绍Go和CGO语言特征
本发明设计的CGOAnalyzer支持共5种语言特征的扫描,包括:
1)CGO函数调用(CGO Function Call):Go代码中通过外部函数接口FFI(ForeignFunction Interface)调用C函数的函数调用表达式(Fuction Call Expression)。
2)导出函数(Exported Function):Go代码中导出到静态库(Static LinkLibrary)或动态库(Shared Object)中供C代码调用的Go函数声明(FunctionDeclaration)。
3)头文件(Header File):Go代码中通过CGO,以注释(Comment)的形式引入的C头文件名称,包括标准库头文件(Standard Header)和用户自定义头文件(User Header)。
4)基本类型转换(Basic Data Type Conversion):Go代码中将Go基本类型转为C基本类型的函数调用表达式(Fuction Call Expression)。
5)CGO机制启用:Go代码仓库是否在代码中包含显式引入CGO机制的声明(ImportDeclaration)。
这些特征对Go软件或者项目会产生不同的影响。通过FFI调用的C函数会造成性能问题,也可能引入同步问题,同时可能将内存隐患带入本身内存安全的Go语言中;其他语言特征也从性能、可维护性、可修改性、可移植性、可靠性等方面影响Go软件。
识别模式构建
针对上述选定的语言特征,通过分析它们在Go语言规范中的定义,本发明为每一种语言特征构建对应的识别模式,这些识别模式会被CGOAnalyzer中的语言特征识别器采用,并记录相应语言特征的上下文(如所在的代码位置、包等),并可统计各种语言特征的使用次数。
上述语言特征的识别需要使用到某一部分或全局的代码、注释信息,这些语言特征可以直接基于源代码和注释来构建识别模式。
下面列举上述语言特征的识别模式
1)CGO函数调用
在Go语言中调用C函数需要在相应代码文件中手动import“C”,并将调用的C函数以C.XXX()的形式调用,比如,若想在Go中调用C函数a,需要在Go中以C.a()的形式调用。其中,import“C”在Go的AST中以ImportSpec形式的结点存在,C.XXX()以SelectorExpr形式的结点存在,并同时实现了CallExpr接口。CGOAnalyzer会在遍历AST的时候检查上述两种结点是否满足要求。
2)导出函数
在Go语言中导出供C使用的Go函数会在其函数声明上方加入//export funcname的函数注释,其中funcname为导出的函数名。这样编译器会自动将其导出到动态或静态链接库中。比如,若要将Go中的a函数导出,则需在其函数声明上方加入//export a的注释。函数上方的注释在Go的AST中以函数的Doc(文档)的形式存在。CGOAnalyzer会检查每个函数的Doc来判断其是否是一个导出函数。
3)头文件
在Go中,被调用的C代码(或其头文件)以注释的形式存在于import“C”上方的注释中。编译器在编译期间会自动识别。import“C”上方的注释在Go的AST中以ImportSpec的Doc(文档)的形式存在。CGOAnalyzer会检查每个import“C”的Doc来判断其中include了哪些头文件。在识别时会对头文件做区分,用尖括号<>的头文件被认为是标准库文件,用双引号””的头文件被认为是用户自定义的头文件。
4)基本类型转换
在Go语言中进行C和Go的类型转换需要在相应代码文件中手动import“C”,被类型转换的对象以C.XXX()的形式调用。比如将Go中int型变量a转换为C中int型变量:C.int(a)。其中,import“C”在Go的AST中以ImportSpec形式的结点存在,C.XXX()以SelectorExpr形式的结点存在,并同时实现了CallExpr接口,且XXX为C中的类型名。CGOAnalyzer会在遍历AST的时候检查上述两种结点是否满足要求。5)CGO机制启用
使用CGO机制的仓库需要在相应代码文件中手动import“C”。CGOAnalyzer会检查仓库中的所有Go代码的AST来判断其是否使用了CGO机制。
语言特征自动识别策略
CGOAnalyzer基于抽象语法树(AST)对语言特征进行自动识别,对于每个语言特征,有如下的2种扫描策略:
1)对于仅涉及到注释的语言特征,如头文件、导出函数,CGOAnalyzer在通过代码构建AST时无需构建完整的AST,仅解析出注释即可。根据包含注释的AST,通过上述语言特征识别模式进行识别。
2)对于涉及到具体AST结点的非注释语言特征,如CGO函数调用、类型转换,CGOAnalyzer需要通过代码来构建完整的AST。构建完后会遍历整个AST找到符合要求的结点并按上述语言特征识别模式进行识别。
CGOAnalyzer自动分析框架
CGOAnalyzer自动分析框架由AST生成器、AST访问器、语言特征识别器、数据分析器、数据库访问器以及issue、commit过滤器组成。
CGOAnalyzer使用Go标准库提供的go/parser和go/ast包来将Go源代码转换成AST,同时ast包提供了AST访问器Visit接口,CGOAnalyzer为每一个需要遍历AST的语言特征定义对应的Visit函数,在其中访问特定结点以收集其信息,收集到的信息将会被语言特征识别器计算后,与语言特征识别模式进行比对,来扫描语言特征的使用情况。
语言特征识别器分析得出的数据会交给数据分析器来进行初步分析。数据分析器会统计各项数据的种类、总值、最大值、最小值、平均值以及具有某项语言特征最多和最小的仓库等。
语言特征识别器分析得出的数据也会交给数据库访问器,数据库访问器会将数据以事先设计好的数据表的形式存储到数据库中,便于数据的管理和查阅。
issue、commit过滤器会爬取Go代码仓库的issue和commit信息并从中匹配和CGO相关的条目。这些条目会被存储到json文件中待进一步分析。
数据库中共包含8个表,分别存储了仓库、包、文件、CGO函数、CGO头文件、CGO库、import的包、导出函数的相关信息。下面详细介绍每个表的内容:
1)repository
表“repository”负责存储Go仓库的信息,列包括id(仓库id,为主键)、repo_name(仓库名)、url(仓库地址)、stars(仓库star的数量)、loc(代码行数)、size(仓库大小)、forks_count(仓库被fork的数量)、issues(仓库issue的数量)、created_at(仓库创建的时间)、updated_at(仓库最近更新的时间)、repo_type(仓库类型)、pushed_at(仓库最近push的时间)、description(仓库的描述)、bindings(仓库是否是bindings类型)、archived(仓库是否已被归档)、educational(仓库是否为教育类型)、outofdate(仓库是否已经过时)。
2)package
表“package”负责存储Go的包的信息。列包括name(包名)、id(包的id,为主键)、repo_id(所属的仓库的id)、path(包的路径)、iscgo(该包内是否启用了CGO机制)。
3)file
表“file”记录Go源代码文件的信息。列包括id(文件id,为主键)、pkg_id(所在的包的id)、repo_id(所在的库的id)、path(文件路径)、iscgo(文件中是否启用了CGO)
4)cgo_function
表“cgo_function”记录CGO调用的C函数的信息。列包括id(函数id,为主键)、func_name(函数名)、file_id(所在的文件id)、line(函数调用所在的行号)、column(函数调用所在的列号)、func_description(函数的描述)
5)cgo_header
表“cgo_header”记录通过CGO调用引入的C头文件。列包括id(头文件id,为主键)、header_name(头文件名)、type(头文件类型,为标准库头文件或者用户头文件)、file_id(引用该头文件的文件id)、line(头文件所在的行号)、column(头文件所在的列号)
6)cgo_lib
表“cgo_lib”记录通过CGO调用链接进来的C静态或动态库。列包括id(lib的id,为主键)、lib_name(lib的名称)、file_id(链接该库的文件id)、line(链接声明所在的行号)、column(链接声明所在的列号)、lib_description(lib的描述)
7)import
表“import”记录被import的包的信息。列包括id(包的id、为主键)、name(包的名称)、type(包的类型)、file_id(import该包的文件id)、line(import该包所在的行号)、column(import该包所在的列号)
8)export_function
表”export_function”记录被导出的go函数信息。列包括id(导出函数的id,为主键)、func_name(导出函数的函数名)、file_id(导出函数所在的文件id)、line(导出函数所在的行号)、column(导出函数所在的列号)
数据库访问器会首先根据事先定义好的相关配置信息连接数据库。连接完成后会在语言特征识别器识别到相应的语言特征后收集相关信息并将其插入到对应的数据表中。
以下通过实验结果来说明本发明的技术效果:
CGO的使用频率
表1展示了在开源项目仓库中使用CGO的Go项目以及使用CGO超过100次的库的数量,结果显示在本发明分析的968个开源项目中,有154个库使用了CGO,而在其中有59个库使用CGO的次数超过了100次。
表1使用CGO机制的开源项目
数量 | 百分比 | |
所有项目 | 968 | 100% |
使用CGO的项目 | 135 | 13.95% |
使用CGO次数大于100的项目 | 53 | 5.48% |
表2开源项目的代码规模及CGO使用统计
图2显示了在使用了CGO的开源库中,使用CGO的数量以及使用CGO的package、文件的数量分布。首先对于图2(a),可以看到多数Go项目库使用CGO的数量在10到1000之间,占比为61.69%,而引用CGO次数大于1000的库则比较少,占比为4.54%。其次,对于图2(b)和图2(c),可以看到在大部分的项目中,CGO的使用主要分布在一个包中以及数个文件中。表2给出了平均每个项目中所含有的代码规模以及CGO使用统计。结合图1中的分布情况,不难发现,开源项目对CGO的使用通常都集中在项目的某个或某几个包中,并且含有CGO的文件包通常Go代码量都比较小(因为使用CGO的包和文件占比分别达到了4.25%和3.68%,而使用CGO的代码行数占比仅0.32%)。这是因为使用CGO的文件中,多数的核心代码是使用C来实现的,这使得CGO相关的Go代码占比较少。
在这些开源项目中,使用CGO频次最高的项目是gl,它是一个针对OpenGL的Gobindings库,它含有39774次CGO使用,其中包含了19次的C对Go的调用和39755次的Go对C的调用。这个项目之所以会有这么多的CGO的引用是因为它为不同版本的OpenGL都单独实现了一个Go语言的binding,每个版本都会包含数千次的引用。通过深入的人工分析发现,项目gl中大部分对于CGO的使用就是通过一个包装函数将OpenGL中的库函数包装成Go函数,写这种包装函数的工作是大量、机器且重复的。所以值得关注的是,gl库中的绑定代码是通过一个名为glow的生成器生成出来的。glow通过一系列的配置文件并解析OpenGL XML APIregistry和EGL XML API registry来自动化的生成针对某个OpenGL版本的Go绑定。这意味着使用自动化的程序来通过CGO生成接口代码是可行的。
下面结合CGO的用途介绍下本发明的作用:
结合CGOAnalyzer给出的结果和人工分析,发现CGO在开源社区主要有以下3种用途:
1.用于为Go实现bindings
bindings可以看作是一套API,它提供在给定编程语言中使用某个库的桥接代码。由于CGO的跨语言调用的特性,其被广泛用于去为Go实现bindings来使得Go可以使用C语言编写的库。几个典型的例子比如spacemonkeygo/openssl是Go语言的OpenSSL bindings,使得Go语言可以使用OpenSSL库。go-opencv是Go的OpenCV bindings。
2.用于获取性能提升
C代码的性能高于Go代码。在一些性能敏感的场景,有些开源仓库为了追求更好的性能使用CGO机制通过C代码来实现对应的功能。比如cosmos-sdk团队在isssue和PR中讨论了是否使用CGO以及对CGO和Go原生的性能做了测试,最终的结果是保留了CGO为了实现更好的验证性能。Dgraph团队为了提升内存管理的性能,使用CGO与jemalloc在Go中实现了一个高性能的手动内存分配器。
3.用于实现某种功能
Go语言较为年轻,库的数量不如传统C语言库的数量多,所以在某些情况下Go标准库可能缺少开源项目要使用的某种功能,此时开源项目会通过CGO调用对应功能的C库函数来实现对应的功能。比如tcell在issue#142中提到,在illumos/Solaris平台上只能通过CGO的方式使用libc来实现对io的控制。
本发明实施例的CGOAnalyzer能让Go语言开发者迅速地了解CGO语言特征在社区中的整体使用情况,为他们的代码编写以及软件优化提供参考。同时本发明实施例的CGOAnalyzer能为Go编译工具链器设计者提供直观的语言特征使用信息,为他们提供必要帮助,可以作为编译器设计及程序分析的辅助工具。
下面再结合本发明实施例对应的软件CGOAnalyzer进行说明:
图3是本发明实施例软件CGOAnalyzer的结构图,其中箭头表示流程顺序,黑色部分表示CGOAnalyzer的组件,白色部分表示数据,灰色部分表示主要使用的API。脚本从GitHub获取和筛选数据集后会交给CGOAnalyzer自动分析框架,之后该框架会为Go仓库构建AST并加以分析。该框架同时会匹配数据集中和CGO相关的issue和commit。最后得到的数据会存入事先定义好的数据库中。
下面结合软件应用再举例说明:
这里以CGO调用函数这一语言特征的扫描为例说明具体的实施方法。CGOAnalyzer扫描语言特征分为三个阶段:
1)阶段一:CGO判定及AST构建
CGOAnalyzer接受Go仓库作为输入。当给它一个Go仓库时,它首先检查其中所有的Go源代码文件,判断其是否使用了CGO(即是否使用了import“C”),若是,则判定其使用了CGO并继续,否则停止。之后使用go/parser和go/ast包为该仓库构建完整的AST用于下一步分析。
2)阶段二:AST遍历及语言特征识别
得到仓库的AST后,CGOAnalyzer会使用针对该项语言特征定义的Visit函数去遍历整个AST。CGO函数调用在AST中以SelcetorExpr的形式存在,并应用了CallExpr接口。因此在遍历AST时会首先判断该结点是否应用了CallExpr接口,之后判断其是否是SelectorExpr。若是,则再判断该SelecotrExpr的X是否是标识符”C”以及确保Sel不是C中的类型名(和类型转换区分开)。确定其是CGO调用函数后会记录其调用次数、所在的Go仓库、包、文件路径等信息。汇总后传给数据分析器
3)阶段三:初步分析及结果输出
数据分析器会统计CGO调用涉及到的所有函数并为每个函数统计其总调用次数、调用其的仓库数量、其在一个仓库中被调用的最多次数、调用其最多的仓库名、最少的仓库名、平均每个仓库的调用次数等信息。最后将分析出的数据和语言特征识别器识别出的语言特征信息存入事先定义好的数据库中。也可将数据作为CSV文件导出。
又一方面,本发明还公开一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如上述任一方法的步骤。
再一方面,本发明还公开一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如上述任一方法的步骤。
在本申请提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一方法的步骤。
可理解的是,本发明实施例提供的系统与本发明实施例提供的方法相对应,相关内容的解释、举例和有益效果可以参考上述方法中的相应部分。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (8)
1.一种Go语言软件中CGO语言特征的自动识别方法,其特征在于,包括以下步骤,
将Go语言代码解析成抽象语法树AST;
遍历抽象语法树AST识别对应的语言特征;
针对对应的语言特征分别进行识别;
将识别的特征存入数据库。
2.根据权利要求1所述的Go语言软件中CGO语言特征的自动识别方法,其特征在于:所述对应的语言特征包括CGO函数调用、导出函数、头文件、基本类型转换以及CGO机制启用。
3.根据权利要求2所述的Go语言软件中CGO语言特征的自动识别方法,其特征在于:当语言特征为CGO函数调用时,识别步骤如下:
遍历Go的AST中的ImportSpec结点,判断其中是否有import”C”;
遍历Go的AST中的其余结点,判断其是否是CallExpr;
判断CallExpr结点中的Fun域是否是SelectorExpr;
判断SelectorExpr是否是C.XXX()的形式,且XXX不是C中类型名。
4.根据权利要求2所述的Go语言软件中CGO语言特征的自动识别方法,其特征在于:当语言特征为导出函数时,识别步骤如下:
遍历Go的AST中的所有顶层结点,判断其是否是FuncDecl;
判断FuncDecl结点的Doc域中的内容是否是//export funcname的形式;其中funcname是该函数的名称。
5.根据权利要求2所述的Go语言软件中CGO语言特征的自动识别方法,其特征在于:当语言特征为头文件时,识别步骤如下:
遍历Go的AST中的ImportSpec结点,判断其中是否有import“C”;
检查import“C”对应的ImportSpec结点的Doc域,判断其中是否包含#include<…h>或#include“…h”,其中…代表头文件名;
使用尖括号<>的头文件被分类为标准库头文件,使用双引号“”的头文件被分类为用户自定义头文件。
6.根据权利要求2所述的Go语言软件中CGO语言特征的自动识别方法,其特征在于:当语言特征为基本类型转换时,识别步骤如下:
遍历Go的AST中的ImportSpec结点,判断其中是否有import“C”;
遍历Go的AST中的其余结点,判断其是否是CallExpr;
判断CallExpr结点中的Fun域是否是SelectorExpr;
判断SelectorExpr是否是C.XXX()的形式,且XXX是C中类型名。
7.根据权利要求2所述的Go语言软件中CGO语言特征的自动识别方法,其特征在于:
当语言特征为CGO机制启用时,识别步骤如下:
遍历仓库所有Go代码文件对应的AST;
遍历AST中的ImportSpec结点,判断其中是否有import“C”。
8.一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如权利要求1至7中任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211180372.8A CN115599440A (zh) | 2022-09-27 | 2022-09-27 | Go语言软件中CGO语言特征的自动识别方法及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211180372.8A CN115599440A (zh) | 2022-09-27 | 2022-09-27 | Go语言软件中CGO语言特征的自动识别方法及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115599440A true CN115599440A (zh) | 2023-01-13 |
Family
ID=84844668
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211180372.8A Pending CN115599440A (zh) | 2022-09-27 | 2022-09-27 | Go语言软件中CGO语言特征的自动识别方法及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115599440A (zh) |
-
2022
- 2022-09-27 CN CN202211180372.8A patent/CN115599440A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11036614B1 (en) | Data control-oriented smart contract static analysis method and system | |
Raghavan et al. | Dex: A semantic-graph differencing tool for studying changes in large code bases | |
US9710243B2 (en) | Parser that uses a reflection technique to build a program semantic tree | |
US9535664B1 (en) | Computerized software development process and management environment | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
CN111913739A (zh) | 一种服务接口原语定义方法和系统 | |
CN114594933A (zh) | 基于文件扫描的前端代码生成方法、装置及存储介质 | |
CN116450616A (zh) | 一种基于解析树的通用异构关系型数据库sql迁移方法 | |
CN112379917A (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
US10891117B2 (en) | Method and system for using subroutine graphs for formal language processing | |
CN111381828A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN115599440A (zh) | Go语言软件中CGO语言特征的自动识别方法及存储介质 | |
US20040010780A1 (en) | Method and apparatus for approximate generation of source code cross-reference information | |
Anderson et al. | Supporting analysis of SQL queries in PHP AiR | |
Míšek et al. | Mapping of dynamic language constructs into static abstract syntax trees | |
Fritzson et al. | Metamodelica–a symbolic-numeric modelica language and comparison to julia | |
CN116185391A (zh) | 应用程序编程接口生成方法、装置、设备及存储介质 | |
CN111381826A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN115221047A (zh) | 测试用例自动生成方法及电子设备 | |
CN114816356A (zh) | 基于接口文档生成http请求代码的系统及方法 | |
CN113448982A (zh) | Ddl语句的解析方法、装置、计算机设备及存储介质 | |
CN111381827A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN111399842A (zh) | 一种代码编译方法及装置 | |
Szőke | Automating the refactoring process | |
Gupta et al. | Optimal code compiling in C |
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 |