2010-08-08 3 views
10

Я экспериментирую с gcov, используя mingw gcc 4.4.0. Я получаю интересные, но странные результаты. Обычная картина что-то вроде этого ...Как получить более точные результаты от 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:} 

Как не то, что return быть exected вообще, учитывая, что цикл непосредственно перед явна как выполнением и выхода? Я думаю, что я жертва оптимизации возвращаемого значения здесь, учитывая, что эта временная переменная имеет тип std::string.

Проблема в том, что я уже указываю -O0 в настройках компилятора. Это точные флаги компилятора я использую ...

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

Мое предположение, что не все оптимизаций отключены по -O0 после всех. Я могу начать поиск определенных оптимизационных флагов один за другим, поскольку я замечаю проблемы, но это кажется странным, что нужно делать.

Итак - какие флаги следует Я уточняю, чтобы получить разумные результаты покрытия из gcov?

EDIT

До сих пор, я думаю, мне нужны следующие дополнительные флаги ...

  • -fno-умолчанию-рядный
  • -fno-рядный

Я не уверен, что они оба нужны, хотя я думаю, что каждый из них отключает другой конкретный тип встроенного.

Я не нашел способа отключить оптимизацию возвращаемого значения. Это не большая проблема, но это немного раздражает. При достижении 100% -ного охвата некоторые файлы, которые действительно достигают 100%, будут сообщаться как меньше из-за этой проблемы. Grep может найти маркеры ##### и показать, если они предназначены для операторов return, но вам все равно нужно сделать визуальный осмотр, чтобы проверить, что проблема - это просто RVO.

+2

Помогает ли добавление -fno-elide-constructors? – Mat

+0

@Mat - Я проверю, но сегодня я занят – Steve314

+0

Возможно, ваша функция встроена. Попробуйте выполнить компиляцию с -O0. – whoplisp

ответ

3

Как указано в комментарии Mat, опция -fno-elide-constructors устраняет эту проблему.

Этот ответ был отправлен, чтобы закрыть этот уже древний вопрос. Если Mat отправит ответ, я удалю его и переключу на него.

Смежные вопросы