gcov и глобальные деструкторы - PullRequest
9 голосов
/ 16 июня 2011

MWE

#include <iostream>

struct Foo {
  Foo() {
    std::cout << "Constructing Foo " << this << std::endl;
  }

  ~Foo() {
    std::cout << "Destructing Foo " << this << std::endl;
  }
};

Foo global_foo;

int main () {
  std::cout << "Entering and exiting main()" << std::endl;
  return 0;

}

Проблема

Скомпилируйте выше с параметрами -fprofile-arcs -ftest-coverage, runnпрограмму, а затем запустить gcov.Вывод программы ясно показывает, что Foo :: Foo (), main () и Foo :: ~ Foo () вызываются в этом порядке.Вывод gcov показывает, что Foo :: Foo () и main () вызываются, но не Foo :: ~ Foo ().

Основная причина

Глобальнаяобъекты уничтожаются обработчиком внутреннего выхода GNU (функция зарегистрирована в at_exit ()).Окончательная статистика gcov создается другим обработчиком выхода.Обработчик выхода gcov явно вызывается перед обработчиком выхода глобального уничтожения, поэтому gcov не видит вызываемых деструкторов.

Состояние ошибки

Это старый, старый ошибка в gcov.Вот ссылка на Bugzilla: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7970. Ошибка все еще существует девять лет спустя, по крайней мере, в i686-apple-darwin10-g ++ - 4.2.1.

Вопрос

Это неразрешимая ошибка в gcov, что-то, с чем мне приходится жить, или это просто что-то, что проскользнуло сквозь трещины (девять лет и совершенно забыто)?Если последнее, как это исправить?

1 Ответ

2 голосов
/ 17 июня 2011

Прежде всего, обратите внимание, что этот отчет об ошибке не подтверждался с 2005 года;вам, вероятно, следует добавить примечание о том, что вы все еще видите плохое поведение в g ++ - 4.2.1.Даже если никто не воздействует на ваше сообщение, полезно иметь эту информацию там.

Краткосрочно, если вы хотите продолжать использовать gcov, вам придется с этим жить.Вместо этого вы можете рассмотреть lcov , что дает вам возможность исключить указанные строки из анализа покрытия.Справедливое предупреждение: я слышал, что это хорошо, но я никогда не использовал его сам.

Среднесрочный период, добавьте этот ответ в систему отслеживания ошибок!Никаких гарантий, но, возможно, это вызовет у какой-то души достаточный интерес, чтобы написать вам патч.

В долгосрочной перспективе, если никто не захочет патчить его для вас, вы сможете его исправить самостоятельно.gcc не самая дружественная кодовая база в мире, и принятие ваших изменений может быть приключением, но если вам это действительно нужно, вы можете это осуществить.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...