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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top