2009-08-18 6 views
0

프로젝트에 인라인으로 유지하기 위해 라이브러리를 약간 변경했습니다. 나는 테스트를 실시했고 모든 것이 여전히 통과되었지만 커버리지는 더 이상 100 %가 아닙니다. 나는 조사하고 그 코드가 단지보고되지 않았다는 것을 알았다. 하지만 gcov가 실행될 때 gcov가 라인에 대한 적용 범위를보고하지 않는 이유는 알 수 없습니다.예기치 않은 커버 결과를보고하는 Gcov

int32_t PreviouslyEncountered(uint32_t n) 
{ 
    uint32_t i; 

    /* Search thru all the numbers encoountered so far see if there is a match */ 
    for(i = 0; i < xcount; i++) 
    { 
    if(n == collection[i]) 
    { 
     return 1; /* This value has been seen before */ 
    } 
    } 

    /* Add the number to encountered values if there is space */ 
    if(xcount < NUMBERTRACKERMAX) 
    { 
    collection[xcount] = n; 
    xcount++; 
    } 
    else 
    { 
    return NUMBERTRACKERMAX ; 
    } 

    return 0; 

} 

이것은 테스트입니다 : :

코드입니다

/* Fill with 10000 elements */ 
for(i = 0; i < NUMBERTRACKERMAX; i++) 
{ 
    assert(PreviouslyEncountered(i) == 0); 
} 

/* Test that all 10000 elements are present */ 
for(i = 0; i < NUMBERTRACKERMAX; i++) 
{ 
    assert(PreviouslyEncountered(i) == 1); 
} 

는 그리고 이것은 커버리지 결과입니다 :

 -: 51:int32_t PreviouslyEncountered(uint32_t n) 
function PreviouslyEncountered called 201 returned 100% blocks executed 90% 
    201: 52:{ 
    201: 53: uint32_t i; 
     -: 54: 
     -: 55: /* Search thru all the numbers encoountered so far see if there is a match */ 
    20101: 56: for(i = 0; i < xcount; i++) 
     -: 57: { 
    19900: 58: if(n == collection[i]) 
     -: 59: { 
    #####: 60:  return 1; /* This value has been seen before */ 
     -: 61: } 
     -: 62: } 
     -: 63: 
     -: 64: /* Add the number to encountered values if there is space */ 
    201: 65: if(xcount < NUMBERTRACKERMAX) 
     -: 66: { 
    200: 67: collection[xcount] = n; 
    200: 68: xcount++; 
     -: 69: } 
     -: 70: else 
     -: 71: { 
     1: 72: return NUMBERTRACKERMAX ; 
     -: 73: } 
     -: 74: 
    200: 75: return 0; 
     -: 76: 
     -: 77:} 

return 1; 실행할 것입니다 전에 인쇄 추가. 그것은 적용 범위를 얻지 못할 것이지만 return 1에는 이제 표지가 있습니다. 어떤 아이디어? man 페이지 이외에는 아무것도 찾을 수 없다.

편집 : 댓글에서 나는 모든 것을 공개하지 않았다는 것을 알 수 있습니다. 나는 그 문제에 대해 몇 가지 진전을 보였다. 다른 함수 중 일부는 다른 함수를 테스트 할 때 커버를 사라지게합니다. PreviouslyEncountered에 대한 테스트 만 실행하면 해당 기능을 100 % 커버 할 수 있습니다. 다른 테스트를 실행하면이 값이 재설정됩니다.

+0

gcov 및 gcc의 버전은 어떤 것이 있습니까? 그러나, 당신이 더 많거나 적게 최신으로 인 한, 중요한 요인이게 확률이 낮다. –

+1

주석이 NUMBERTRACKERMAX가 10,000이라고 할 때 함수가 201 번 실행되는 이유는 무엇입니까? 테스트를 위해 100으로 변경 했습니까? 함수가 이상하게 호출되는 곳은 어디입니까? –

+0

또한 함수를 100 번 호출하여 숫자를 추가 한 다음 100 번 반복하여 번호가 존재하는지 확인하는 이유는 무엇입니까? 200 번을 추가하는 이유는 무엇입니까? –

답변

-1

문제를 일으킨 코드를 리팩터링하여 다시 100 % 적용 범위를 확보 할 수있었습니다. 문제가 어디에서 왔는지 전혀 모르겠습니다. 어쩌면 다시 확인해 볼 것입니다.