2013-03-07 79 views
0

我想看看有多少goto指令是在一个c + +项目。现在,我使用的是简单的匹配与grep搜索"goto "找到有多少gotos是在一个c + +项目

grep -r --exclude-dir "third_party" --include "*.cpp" --include "*.h" --include "*.C" --include "*.cxx" --include "*.hcc" --include "*.c" --include "*.cc" "goto " . 

我得到了很多的假阳性,尤其是里面的评论:

// Perform stack overflow check if this goto needs it before jumping. 

或里面的文字:

stream->Add(" goto ("); 

避免它们的最简单方法是什么?我不需要一个完美的解决方案。

+0

你特别需要最简单的方法吗?或者*任何*提供正确答案的方式就足够了? – 2013-03-07 16:59:39

+1

“goto”的所有实例都在单行上吗?如果是这样,一个简单的正则表达式应该可以工作,比如'^ \ s * goto \ s。*'。 – 2013-03-07 16:59:47

+1

将所有'goto'字符串替换为'gotozzz',编译并计算编译错误的数量。 – 2013-03-07 17:00:02

回答

2

将正则表达式更改为:'goto[ \t]+[_A-Za-z0-9]+[ \t]*;'这将在同一行上搜索goto,其目标标签和分号。

+0

而且不会匹配制表符分隔的标签。 – Pihhan 2013-03-07 17:09:33

+0

是的,我的第一个编辑是'goto \ s + \ w + \ s *;',但egrep不采用'\ s'。固定。 – 2013-03-07 17:11:41

+0

..并且整个方法不会找到任何超过1行的goto语句... – 2013-03-07 17:38:51

2

您可能会考虑使用静态分析工具,例如, cppcheck为此。处理所有可能的情况只使用正则表达式可能会变得不适用。

0

我建议使用awk或其他工具,可以使用多个正则表达式或写一个脚本。

更困难的情况是:

/***** 
* Goto system failure if this point is reached. 
*/ 

含义内C风格的注释什么。

相关问题