Как я могу получить более точные результаты от gcov?

Я экспериментирую с gcov, используя mingw gcc 4.4.0. Я получаю интересные, но странные результаты. Обычная схема примерно такая...

     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 может вообще не выполняться, учитывая, что предыдущий цикл явно одновременно выполняется и завершается? Я думаю, что стал жертвой оптимизации возвращаемого значения, учитывая, что эта временная переменная имеет тип std::string.

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

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

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

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

ИЗМЕНИТЬ

Пока что я думаю, что мне нужны следующие дополнительные флаги...

  • -fno-по умолчанию встроенный
  • -fno-встроенный

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

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


person Steve314    schedule 08.08.2010    source источник
comment
Помогает ли добавление -fno-elide-constructors?   -  person Mat    schedule 05.03.2011
comment
@Mat - я проверю, но я сегодня занят   -  person Steve314    schedule 07.03.2011
comment
Возможно, ваша функция встроена. Попробуйте скомпилировать с -O0.   -  person whoplisp    schedule 03.07.2011
comment
@whoplist - взгляните на вопрос. особ. бит, который говорит Беда в том, что я уже указываю -O0 в опциях компилятора. Мэт может быть прав, а может и нет - как это ни стыдно, я еще не удосужился проверить.   -  person Steve314    schedule 04.07.2011
comment
@Mat - после долгой задержки у меня наконец-то появилась возможность снова настроить среду сборки для этого и проверить ваше предложение - и оно работает. Если вы можете опубликовать это как ответ, я приму это. Спасибо.   -  person Steve314    schedule 31.08.2011


Ответы (1)


Как было предложено в комментарии Мэта, опция -fno-elide-constructors решает эту проблему.

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

person Steve314    schedule 02.09.2011