2013-03-07 25 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風格的註釋什麼。

相關問題