2009-08-18 4 views
0

Ich habe einige Änderungen an einer Bibliothek vorgenommen, um sie in einem Projekt zu halten. Ich habe den Test gemacht und alles ist noch bestanden, aber die Abdeckung ist nicht mehr 100%. Ich habe nachgeforscht und gesehen, dass der Code gerade nicht gemeldet wird. Aber ich habe keine Ahnung, warum gcov keine Abdeckung für die Linie meldet, wenn sie ausgeführt wird.Gcov meldet unerwartete Cover-Ergebnisse

Dies ist der 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; 

} 

Dies ist der 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); 
} 

Und dies ist die Berichterstattung Ergebnisse:

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

einen Druck Hinzufügen vor return 1; ausführen würde. Es würde keine Abdeckung erhalten, aber die return 1 würde jetzt Abdeckung haben. Irgendwelche Ideen? außer Manpages kann ich nichts finden.

Edit: Aus den Kommentaren können Sie sehen, dass ich nicht alles offengelegt habe. Ich habe einige Fortschritte bei dem Problem gemacht. Einige der anderen Tests führen dazu, dass die Abdeckung beim Laufen verschwindet. Wenn nur die Tests für PreviouslyEncountered ausgeführt werden, wird diese Funktion zu 100 Prozent abgedeckt. Durch Ausführen anderer Tests wird dies zurückgesetzt.

+0

Welche Version von gcov - und gcc - und auf welcher Plattform? Solange Sie jedoch mehr oder weniger aktuell sind, ist es unwahrscheinlich, dass dies ein wichtiger Faktor ist. –

+1

Warum wird die Funktion 201 mal ausgeführt, wenn die Kommentare NUMBERTRACKERMAX 10.000 sind? Hast du es zum Testen auf 100 gesetzt? Woher kommt der ungerade Aufruf der Funktion? –

+0

Wenn Sie die Funktion 100 Mal aufrufen, um Nummern hinzuzufügen, und dann 100 Mal, um zu überprüfen, ob die Nummer vorhanden ist, warum werden die Nummern 200 Mal addiert? –

Antwort

-1

Ich konnte den Code, der das Problem verursacht hat, umgestalten, damit ich wieder 100% Deckung bekomme. Ich habe keine Ahnung, wo das Problem herkommt. Vielleicht werde ich es noch einmal überprüfen.