C语言 我怎样才能得到一个关于函数长度的统计数据?

xqk2d5yq  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(100)

我必须处理一个相当大的遗留代码库。代码是从字面上从另一个时间和事情做了不同的然后。由于函数调用在过去是相当昂贵和缓慢的,函数往往是相当长的。
有没有一种方法可以自动获得一个函数名列表和它们在LOC中的长度?
我找了一段时间,但没有找到真实的的解决办法。我记得有静态代码分析工具,如果函数太长,它们会抱怨,但我没有发现任何有用的东西。
任何提示将不胜感激!

dw1jzc5e

dw1jzc5e1#

您可以使用ctags来分析代码。基于https://stackoverflow.com/a/41618018/,您可以使用

ctags --c-kinds=f --fields=+ne -o - yourfile.c

字符串
在来自https://codereview.stackexchange.com/questions/285893/dos-based-boggle-simulator的一些示例代码上测试此方法,得到以下结果:

dictionary  boggle.c    /^void dictionary() {$/;"   f   line:168    typeref:typename:void   end:213
intidx  boggle.c    /^int intidx(int *arr, int arrLen, int idx) {$/;"   f   line:36 typeref:typename:int    end:44
main    boggle.c    /^int main(int argc, char** argv) {$/;" f   line:215    typeref:typename:int    end:246
newboard    boggle.c    /^void newboard() {$/;" f   line:73 typeref:typename:void   end:164
printhelp   boggle.c    /^void printhelp() {$/;"    f   line:62 typeref:typename:void   end:70
randLte boggle.c    /^int randLte(int upperBound) {$/;" f   line:48 typeref:typename:int    end:59


你可以使用正则表达式通过Perl来提取函数名,开始行,结束行,并计算结束和开始之间的差异:

ctags --c-kinds=f --fields=+ne -o - boggle.c|perl -lne'm/\/\^([^)]+\)).*line:(\d+).*end:(\d+)/; print "$1 ".($3-$2)'


测试结果:

void dictionary() 45
int intidx(int *arr, int arrLen, int idx) 8
int main(int argc, char** argv) 31
void newboard() 91
void printhelp() 8
int randLte(int upperBound) 11

相关问题