2016-07-20 2 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. Что я могу сделать, поэтому я получаю только «значимые» данные, а встроенные функции приписываются правильно при их определении?

Я использую г ++ - 4.8 и gcov-4,8

Edit: Если я расколоть, если в его звонки я получаю это:

 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 call» в середине функции на линии, где подобные строки (только целочисленные параметры изменены) не имеют этого. Поэтому мое текущее решение - использовать gcov-4.8 без данных ветвления, поскольку он полностью ненадежен.

ответ

0

Возможно, что в точках есть дополнительные ветви, где могут быть исключения, например. в пунктах вызова функции.

Например, мы наблюдали ветку с gcov в нашем (не лишнем) пустом виртуальном деструкторе, который мы не можем покрыть нашими тестами.

+0

Этот: http://stackoverflow.com/questions/7199360/what-is-the-branch-in-the-destructor-reported-by-gcov?rq=1? Однако это сайт вызова. Не должно быть никаких филиалов на сайте вызова, должно быть? – Flamefire

+0

Интересный комментарий. Кажется, что ветвь, которую мы наблюдаем, связана с динамическим/нединамическим различием, а не с ветвью исключения. Тогда мы могли бы это проверить. Я попробую в понедельник. – koraxkorakos

Смежные вопросы