Как я могу получить более точные результаты от gcov? - PullRequest
10 голосов
/ 08 августа 2010

Я экспериментирую с 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 в здравом уме?

EDIT

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

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

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

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

1 Ответ

3 голосов
/ 02 сентября 2011

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

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

...