2009-08-18 4 views
0

J'ai apporté quelques modifications à une bibliothèque pour qu'elle reste en ligne avec un projet. J'ai fait le test et tout est encore passé mais la couverture n'est plus à 100%. J'ai enquêté et j'ai vu que le code est exécuté juste non rapporté. Mais je ne sais pas pourquoi gcov ne signale pas la couverture de la ligne lorsqu'elle est en cours d'exécution.Gcov rapportant des résultats de couverture inattendus

Voici le code:

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; 

} 

C'est le test:

/* 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); 
} 

Et ce sont les résultats de couverture:

 -: 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:} 

Ajout d'une impression avant return 1; serait exécuter. Il ne serait pas couvert, mais le return 1 aurait maintenant une couverture. Des idées? autre que les pages man je ne peux rien trouver.

Modifier: À partir des commentaires, vous pouvez voir que je n'ai pas tout divulgué. J'ai fait quelques progrès sur le problème. Certains des autres tests d'autres fonctions font disparaître le couvercle lorsqu'ils fonctionnent. Exécuter uniquement les tests pour PreviouslyEncountered donne 100% de couverture pour cette fonction. L'exécution d'autres tests réinitialise ceci.

+0

Quelle version de gcov - et gcc - et sur quelle plateforme? Cependant, tant que vous êtes plus ou moins à jour, il est peu probable que ce soit un facteur majeur. –

+1

Pourquoi la fonction est-elle exécutée 201 fois lorsque les commentaires indiquent NUMBERTRACKERMAX 10 000? Avez-vous changé à 100 pour tester? D'où vient l'appel impair à la fonction? –

+0

Aussi, si vous appelez la fonction 100 fois pour ajouter des nombres, puis 100 fois pour vérifier que le nombre est présent, pourquoi ajoutez-vous les nombres 200 fois? –

Répondre

-1

J'ai été capable de refactoriser le code qui a causé le problème, donc je suis à nouveau 100% de couverture. Je n'ai aucune idée d'où vient le problème. Peut-être que je vais vérifier à nouveau.

Questions connexes