2016-07-20 59 views
2

我生成覆蓋率數據並使用在線服務進行可視化和CI。然而,我有奇怪的「部分」(如果分支沒有完全覆蓋)。看着gcov數據,似乎檢測到過量的分支。覆蓋率數據中的意外分支數量

一個例子:

function _ZNK5World8AdjustBQE5PointItEh15BuildingQuality called 415 returned 100% blocks executed 76% 
     415: 377:BuildingQuality World::AdjustBQ(const MapPoint pt, unsigned char player, BuildingQuality nodeBQ) const 
     -: 378:{ 
     415: 379: if(nodeBQ == BQ_NOTHING || GetNode(pt).owner != player + 1 || !IsPlayerTerritory(pt)) 
branch 0 taken 95% (fallthrough) 
branch 1 taken 5% 
call 2 returned 100% 
call 3 returned 100% 
branch 4 taken 100% (fallthrough) 
branch 5 taken 0% (throw) 
branch 6 taken 85% (fallthrough) 
branch 7 taken 15% 
call 8 returned 100% 
call 9 returned 100% 
branch 10 taken 100% (fallthrough) 
branch 11 taken 0% (throw) 
branch 12 taken 17% (fallthrough) 
branch 13 taken 83% 
branch 14 taken 80% (fallthrough) 
branch 15 taken 20% 
branch 16 taken 95% (fallthrough) 
branch 17 taken 5% 
branch 18 taken 33% (fallthrough) 
branch 19 taken 67% 
branch 20 never executed 
branch 21 never executed 
branch 22 never executed 
branch 23 never executed 
call 24 never executed 

好像仍然可以得到內聯和計算的功能,雖然我已經有-g -O0 --coverage -fno-default-inline -fno-inline編譯。我能做什麼,所以我只能得到「有意義」的數據,而內聯函數在他們的定義中被正確地歸因於什麼?

我用G ++ - 4.8和gcov的-4.8

編輯:如果我分裂彷彿進入了它的電話我得到這個:

 415: 379: unsigned char owner = GetNode(pt).owner; 
call 0 returned 100% 
call 1 returned 100% 
branch 2 taken 100% (fallthrough) 
branch 3 taken 0% (throw) 
call 4 never executed 
     415: 380: bool isPlayerTer = IsPlayerTerritory(pt); 
call 0 returned 100% 
call 1 returned 100% 
branch 2 taken 100% (fallthrough) 
branch 3 taken 0% (throw) 
call 4 never executed 
     415: 381: if(nodeBQ == BQ_NOTHING || owner != player + 1 || !isPlayerTer) 
branch 0 taken 95% (fallthrough) 
branch 1 taken 5% 
branch 2 taken 85% (fallthrough) 
branch 3 taken 15% 
branch 4 taken 17% (fallthrough) 
branch 5 taken 83% 

所以,問題是真正的電話。我能做些什麼,以便這些電話(及其分支機構(???))不會被添加到覆蓋數據中?

剛剛在asm代碼中發現了一個人造分支,它只是檢查一個寄存器並執行nop(除了gcov計數器增量)WTF?

0x0000000000d967de <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+340>: test %bl,%bl 
    0x0000000000d967e0 <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+342>: je  0xd967f5 <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+363> 
    0x0000000000d967e2 <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+344>: nop 
    0x0000000000d967e3 <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+345>: mov 0x1206c9e(%rip),%rax  # 0x1f9d488 <__gcov0._ZNK5World8AdjustBQE5PointItEh15BuildingQuality+72> 
    0x0000000000d967ea <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+352>: add $0x1,%rax 
    0x0000000000d967ee <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+356>: mov %rax,0x1206c93(%rip)  # 0x1f9d488 <__gcov0._ZNK5World8AdjustBQE5PointItEh15BuildingQuality+72> 
    0x0000000000d967f5 <World::AdjustBQ(Point<unsigned short>, unsigned char, BuildingQuality) const+363>: test %dl,%dl 

我切換到鐺++和llvm-cov gcov,得到了對於這種情況下(只有6個分支)正確的結果。不過,我在其他地方也有一些誤報。其中一個最令人困擾的是似乎是一個函數中間的「函數__cxx_global_array_dtor調用」,其中類似的行(只有整數參數被改變)的線沒有這個函數。所以我目前的解決方案是使用沒有分支數據的gcov-4.8,因爲它是完全不可靠的。

回答

0

有可能在點上有額外的分支,例如可能發生例外。在函數調用點。

例如,我們在我們的(不是noexcept)空虛擬析構函數中觀察到一個帶有gcov的分支,我們不能通過測試來覆蓋它。

+0

This one:http://stackoverflow.com/questions/7199360/what-is-the-branch-in-the-destructor-reported-by-gcov?rq=1?但是,這是通話網站。在呼叫現場不應該有分支機構,應該在那裏? – Flamefire

+0

有趣的評論。看來我們觀察到的分支來自動態/非動態虛擬,而不是來自異常分支。然後我們可以通過測試來覆蓋這個。我會在星期一嘗試。 – koraxkorakos