好用的C语言分析工具 CTags

CTags 是一款开源的 C语言分析工具,项目地址是:

https://github.com/universal-ctags/ctags

使用这个工具可以分析C语言,例如:

ctags C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c

可以得到下面的结果;

!_TAG_EXTRA_DESCRIPTION	anonymous	/Include tags for non-named objects like lambda/
!_TAG_EXTRA_DESCRIPTION	fileScope	/Include tags of file scope/
!_TAG_EXTRA_DESCRIPTION	pseudo	/Include pseudo tags/
!_TAG_EXTRA_DESCRIPTION	subparser	/Include tags generated by subparsers/
!_TAG_FIELD_DESCRIPTION	epoch	/the last modified time of the input file (only for F\/file kind tag)/
!_TAG_FIELD_DESCRIPTION	file	/File-restricted scoping/
!_TAG_FIELD_DESCRIPTION	input	/input file/
!_TAG_FIELD_DESCRIPTION	name	/tag name/
!_TAG_FIELD_DESCRIPTION	pattern	/pattern/
!_TAG_FIELD_DESCRIPTION	typeref	/Type and name of a variable or typedef/
!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/
!_TAG_KIND_DESCRIPTION!C	d,macro	/macro definitions/
!_TAG_KIND_DESCRIPTION!C	e,enumerator	/enumerators (values inside an enumeration)/
!_TAG_KIND_DESCRIPTION!C	f,function	/function definitions/
!_TAG_KIND_DESCRIPTION!C	g,enum	/enumeration names/
!_TAG_KIND_DESCRIPTION!C	h,header	/included header files/
!_TAG_KIND_DESCRIPTION!C	m,member	/struct, and union members/
!_TAG_KIND_DESCRIPTION!C	s,struct	/structure names/
!_TAG_KIND_DESCRIPTION!C	t,typedef	/typedefs/
!_TAG_KIND_DESCRIPTION!C	u,union	/union names/
!_TAG_KIND_DESCRIPTION!C	v,variable	/variable definitions/
!_TAG_OUTPUT_EXCMD	mixed	/number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP	slash	/slash or backslash/
!_TAG_OUTPUT_MODE	u-ctags	/u-ctags or e-ctags/
!_TAG_OUTPUT_VERSION	1.1	/current.age/
!_TAG_PARSER_VERSION!C	2.2	/current.age/
!_TAG_PATTERN_LENGTH_LIMIT	96	/0 for no limit/
!_TAG_PROC_CWD	C:/Users/yanbwang/Downloads/ctags/	//
!_TAG_PROGRAM_AUTHOR	Universal Ctags Team	//
!_TAG_PROGRAM_NAME	Universal Ctags	/Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL	https://ctags.io/	/official site/
!_TAG_PROGRAM_VERSION	6.2.0	/p6.2.20260125.0/
!_TAG_ROLE_DESCRIPTION!C!function	foreigncall	/called in foreign languages/
!_TAG_ROLE_DESCRIPTION!C!function	foreigndecl	/declared in foreign languages/
!_TAG_ROLE_DESCRIPTION!C!header	local	/local header/
!_TAG_ROLE_DESCRIPTION!C!header	system	/system header/
!_TAG_ROLE_DESCRIPTION!C!macro	undef	/undefined/
!_TAG_ROLE_DESCRIPTION!C!struct	foreigndecl	/declared in foreign languages/
AddressWidthInitialization	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^AddressWidthInitialization ($/;"	f	typeref:typename:VOID
GetFirstNonAddress	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetFirstNonAddress ($/;"	f	typeref:typename:STATIC UINT64
GetPeiMemoryCap	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetPeiMemoryCap ($/;"	f	typeref:typename:STATIC UINT32
GetSystemMemorySizeAbove4gb	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetSystemMemorySizeAbove4gb ($/;"	f	typeref:typename:STATIC UINT64
GetSystemMemorySizeBelow4gb	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetSystemMemorySizeBelow4gb ($/;"	f	typeref:typename:UINT32
InitializeRamRegions	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^InitializeRamRegions ($/;"	f	typeref:typename:VOID
PublishPeiMemory	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^PublishPeiMemory ($/;"	f	typeref:typename:EFI_STATUS
Q35TsegMbytesInitialization	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^Q35TsegMbytesInitialization ($/;"	f	typeref:typename:VOID
QemuInitializeRam	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^QemuInitializeRam ($/;"	f	typeref:typename:STATIC VOID
mPhysMemAddressWidth	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^UINT8  mPhysMemAddressWidth;$/;"	v	typeref:typename:UINT8
mQ35SmramAtDefaultSmbase	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^BOOLEAN  mQ35SmramAtDefaultSmbase = FALSE;$/;"	v	typeref:typename:BOOLEAN
mQ35TsegMbytes	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^STATIC UINT16  mQ35TsegMbytes;$/;"	v	typeref:typename:STATIC UINT16
mS3AcpiReservedMemoryBase	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^STATIC UINT32  mS3AcpiReservedMemoryBase;$/;"	v	typeref:typename:STATIC UINT32
mS3AcpiReservedMemorySize	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^STATIC UINT32  mS3AcpiReservedMemorySize;$/;"	v	typeref:typename:STATIC UINT32

类似的,可以直接分析取得C语言中的函数名,命令是:

ctags --c-kinds=f C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c

输出结果:

AddressWidthInitialization	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^AddressWidthInitialization ($/;"	f	typeref:typename:VOID
GetFirstNonAddress	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetFirstNonAddress ($/;"	f	typeref:typename:STATIC UINT64
GetPeiMemoryCap	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetPeiMemoryCap ($/;"	f	typeref:typename:STATIC UINT32
GetSystemMemorySizeAbove4gb	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetSystemMemorySizeAbove4gb ($/;"	f	typeref:typename:STATIC UINT64
GetSystemMemorySizeBelow4gb	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^GetSystemMemorySizeBelow4gb ($/;"	f	typeref:typename:UINT32
InitializeRamRegions	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^InitializeRamRegions ($/;"	f	typeref:typename:VOID
PublishPeiMemory	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^PublishPeiMemory ($/;"	f	typeref:typename:EFI_STATUS
Q35TsegMbytesInitialization	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^Q35TsegMbytesInitialization ($/;"	f	typeref:typename:VOID
QemuInitializeRam	C:/BuildBs/edk2202302/edk2/OvmfPkg/Bhyve/PlatformPei/MemDetect.c	/^QemuInitializeRam ($/;"	f	typeref:typename:STATIC VOID

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注