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