我正在使用GCC 4.9和GCOV來獲取代碼和分支機構覆蓋範圍。然而,分支覆蓋的結果對我的C++代碼來說完全沒有用處。儘管使用了我所知道的所有-fno-*-inline
標誌,但似乎GCC內聯模板。如何使用gcov抑制內聯模板
這裏是一個小例子應用程序,說明了這個問題:
#include <string>
#include <iostream>
using namespace std;
int main() {
string foo;
foo = "abc";
cout << foo << endl;
}
我編譯程序與g++ -O0 -fno-inline -fno-inline-small-functions -fno-default-inline --coverage -fprofile-arcs test.cpp -o test
運行test
,gcovr -r . -b
打印後:
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File Branches Taken Cover Missing
------------------------------------------------------------------------------
test.cpp 14 7 50% 7,8,9,10
------------------------------------------------------------------------------
TOTAL 14 7 50%
------------------------------------------------------------------------------
沒有一個在我們的main
函數中有單分支。例如,第7行包含string foo;
。看起來std::basic_string<...>
的構造函數中有一些if語句,但在查看main
的覆蓋範圍時,這不是有用的信息。
問題是,所有這些內聯分支總結,併爲我的實際單元測試計算分支覆蓋率約爲40%。我對我的代碼的分支覆蓋感興趣,而不是我在C++標準庫中打的多少分支。
是否有任何方法可以在編譯器中完全關閉內聯或者告訴GCOV不考慮內聯分支?我無法在GCOV主頁或其他地方找到關於該主題的任何指南。
任何幫助,非常感謝。
gcov輸出文件顯示什麼?即使沒有內聯,所有std庫代碼也會歸入總結中的'test.cpp',但詳細輸出應顯示分支出現的實際功能。 – Useless