2015-07-10 60 views
1

我想在靜態庫上執行代碼覆蓋率。爲此,我使用boost來編寫測試用例。在我的庫中,我有許多在頭文件中定義的函數。C源代碼的GCOV靜態庫覆蓋率

例如在頭文件accuracy.h我具有以下功能

static float absf(float x) 
{ 
    return (x >= 0.0f) ? x : -x; 
} 

static boolean almost_zero(float n, float tol) 
{ 
    return (boolean)(absf(n) <= tol); 
} 

我已經寫測試用例用於這些功能。但問題是GCOV顯示這些功能沒有涵蓋。如果我將函數定義移動到C文件,那麼我會得到適當的覆蓋結果。

我已經使用-fprofile-arcs -ftest-coverag來執行覆蓋。有沒有人有任何想法在這個問題上。

注意:
測試用例正確執行。我已通過調試進行確認。
我正在使用MinGW gcc版本4.8.1(GCC)。

+0

'absf()'似乎有點無意義,爲什麼不使用標準['fabs()'](http://linux.die.net/man/3/fabs)呢? 'boolean'也是非標準的,使用'bool'。 – unwind

+0

'absf'的返回類型應該是float。 – ryanpattison

+0

absf和almost_zero是虛擬函數來解釋場景:)。我已經編輯了返回類型的任何方式 –

回答

3

頭文件中的函數難以覆蓋。這不僅僅是一個技術難題 - 這也是一個介紹難點。每次包含頭文件時都會複製這些函數。全覆蓋是否需要覆蓋所有副本?或者一個實例被覆蓋?

從用戶的角度來看,兩種答案都可能是錯誤的。

此外,潛在的頭文件中可能存在用戶不關心的函數。例如,ctype.h有一些這些。

這可能是爲什麼覆蓋工具往往完全忽略它們。

我使用覆蓋工具RapiCover,我們的方法是默認忽略它們,但提供一個選項來打開標題覆蓋範圍。該選項可以逐個文件地使用,也可以專門命名您想要覆蓋的功能。我們發現這是支持典型客戶需求的最佳方式。

我建議你試着強制gcov來相信函數是用C源代碼而不是頭來定義的。爲此,請預處理源文件(例如,GCC的-E選項),然後過濾出指示文件和行號的#標記。然後在此經過預處理的過濾文件上執行gcov。它應該將所有功能看作源代碼的一部分。這個技巧也適用於RapiCover,雖然在那裏並不需要。

+0

你能解釋一下_濾除表示文件和行號的#標記嗎? –

+0

通過預處理器(例如'gcc -E')傳遞C/C++程序,您將在輸出中看到它們。它們是以'#'開頭的行。 –