Подтвердить что ты не робот

Как получить более точные результаты от 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.

4b9b3361

Ответ 1

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

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