Come posso ottenere risultati più accurati da gcov?
Domanda
sto sperimentando gcov usando MinGW gcc 4.4.0. Sono stato sempre alcuni risultati interessanti, ma strani. Un modello comune è qualcosa di simile ...
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 può che return
non può essere exected a tutti, dato che il ciclo appena prima che chiaramente è allo stesso tempo di esecuzione e di uscire? Penso di essere una vittima della ottimizzazione 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 caccia giù specifiche flag di ottimizzazione uno per uno, come ho notato problemi, ma questo sembra una cosa strana per necessità di fare.
-? Quali flag dovrebbe I essere che specificano in modo da ottenere i risultati di copertura sane da gcov
Modifica
Finora, penso di aver bisogno il seguente flag addizionali ...
- -fno-default-inline
- -fno-inline
Non sono sicuro che questi sono entrambi necessari, anche se penso che ogni disabilitare un diverso tipo specifico di linea.
non ho trovato alcun modo per disattivare le ottimizzazioni di valore di ritorno, però. Questo non è un grosso problema, ma è un po 'di un fastidio. Quando mirano per la copertura del 100%, alcuni file che in realtà non raggiungere il 100% saranno riportati come meno a causa di questo problema. Un grep riesce a trovare i marcatori #####
e mostrare se sono per le dichiarazioni return
, ma è comunque necessario fare un po 'ispezione visiva per verificare che il problema è puramente un RVO.
Soluzione
Come suggerito nel commento di Mat, le correzioni opzione -fno-elide-constructors
questo problema.
Questa risposta è stata inviata per ottenere questo già antica questione chiusa. Se Mat messaggi una risposta, dovrò eliminare questo e passare l'accettare di questo.