나는 서비스 데이터를 생성하고 시각화 및 CI를 위해 온라인 서비스를 사용합니다. 그러나 나는 이상한 "부분적"(if-branches는 완전히 덮혀 있지 않다)을 가지고있다. gcov 데이터를 살펴보면 과도한 분지가 감지되는 것처럼 보입니다.범위 데이터에서 예기치 않은 분기 수
예 : 이미 -g -O0 --coverage -fno-default-inline -fno-inline
로 컴파일하고있어 있지만
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을 사용하고 있습니다 - 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%
그래서 문제가 정말 전화입니다 : 나는이가 전화로 내가받을 경우 분할합니다. 이러한 전화 (및 지사 (???))가 서비스 데이터에 추가되지 않도록하려면 어떻게해야합니까?
그냥 레지스터를 검사하고 nop (gcov 카운터 증가 외에) WTF를 수행하는 asm 코드에서 인공 분기를 찾았습니까?
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 가지)에 대한 올바른 결과를 얻었다. 그러나 나는 또한 다른 장소에서 약간의 잘못된 반응을 보였다. 가장 혼란스러운 것들 중 하나는 유사한 행 (정수 매개 변수 만 변경됨)이없는 행의 함수 중간에 "function __cxx_global_array_dtor call"인 것처럼 보입니다. 그래서 현재의 솔루션은 완전히 신뢰할 수 없기 때문에 브랜치 데이터없이 gcov-4.8을 사용하는 것입니다.
이 하나 : http://stackoverflow.com/questions/7199360/what-is-the-branch-in-the-destructor-reported-by-gcov?rq=1? 그러나 이것은 전화 사이트입니다. 전화 사이트에 어떤 지점도 없어야합니까? – Flamefire
흥미로운 의견입니다. 우리가 관찰 한 지점은 예외 지점이 아닌 역동적 인/비 동적 인 관점에서 나온 것 같습니다. 그런 다음 테스트를 통해이 문제를 해결할 수 있습니다. 나는 월요일에 그것을 시도 할 것이다. – koraxkorakos