我必须处理一个相当大的遗留代码库。代码是从字面上从另一个时间和事情做了不同的然后。由于函数调用在过去是相当昂贵和缓慢的,函数往往是相当长的。有没有一种方法可以自动获得一个函数名列表和它们在LOC中的长度?我找了一段时间,但没有找到真实的的解决办法。我记得有静态代码分析工具,如果函数太长,它们会抱怨,但我没有发现任何有用的东西。任何提示将不胜感激!
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
型
1条答案
按热度按时间dw1jzc5e1#
您可以使用ctags来分析代码。基于https://stackoverflow.com/a/41618018/,您可以使用
字符串
在来自https://codereview.stackexchange.com/questions/285893/dos-based-boggle-simulator的一些示例代码上测试此方法,得到以下结果:
型
你可以使用正则表达式通过Perl来提取函数名,开始行,结束行,并计算结束和开始之间的差异:
型
测试结果:
型