2010-08-08 14 views
10

Sto sperimentando con gcov usando mingw gcc 4.4.0. Ho ottenuto risultati interessanti ma strani. Un modello comune è qualcosa di simile ...Come posso ottenere risultati più accurati da gcov?

 5162: 66: std::string::iterator i = l_Temp.begin(); 
    5162: 67: std::string::iterator j = l_Temp.end() - 1; 
     -: 68: char ch; 
     -: 69: 
    20564: 70: while (i < j) 
     -: 71: { 
    10240: 72: ch = *i; *i = *j; *j = ch; i++; j--; 
     -: 73: } 
     -: 74: 
    #####: 75: return l_Temp; 
     -: 76:} 

Come non può che essere return exected a tutti, dato che il ciclo appena prima che chiaramente è allo stesso tempo di esecuzione e di uscire? Penso di essere vittima dell'ottimizzazione del valore di ritorno qui, dato che questa variabile temporanea è di tipo std::string.

Il problema è che sto già specificando -O0 nelle opzioni del compilatore. Queste sono le esatte flag di compilazione che sto usando ...

-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage 

La mia ipotesi migliore è che non tutte le ottimizzazioni sono disabilitate per -O0 dopo tutto. Posso iniziare a cercare i singoli flag di ottimizzazione uno per uno, perché noto dei problemi, ma questa sembra una cosa strana da fare.

Quindi - quali bandiere dovrei specificare per ottenere risultati di copertura sani da gcov?

EDIT

Finora, penso che ho bisogno dei seguenti flag addizionali ...

  • -fno-default-inline
  • -fno-inline

Non sono sicuro che entrambi siano necessari, anche se penso che disabilitino ciascuno un tipo specifico di inline diverso.

Non ho trovato alcun modo per disattivare le ottimizzazioni del valore di ritorno, però. Questo non è un grosso problema, ma è un po 'fastidioso. Quando si mira a una copertura del 100%, alcuni file che raggiungono il 100% saranno segnalati come meno a causa di questo problema. Un grep può trovare i marcatori ##### e mostrare se sono per le dichiarazioni return, ma è comunque necessario eseguire alcune ispezioni visive per verificare che il problema sia puramente un RVO.

+2

L'aggiunta di costruttori -fno-elide ne aiuta? – Mat

+0

@Mat - Controllo, ma sono occupato oggi – Steve314

+0

Forse la tua funzione è in linea. Prova a compilare con -O0. – whoplisp

risposta

3

Come suggerito nel commento di Mat, l'opzione -fno-elide-constructors risolve questo problema.

Questa risposta è stata inviata per ottenere questa domanda già antica chiusa. Se Mat invia una risposta, la cancellerò e accenderò l'accettazione.

Problemi correlati