gcov и глобальные деструкторы

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, запустите программу, а затем запустите 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, с которой мне приходится жить, или это просто что-то, что случайно ускользнуло из трещин (девять лет и совершенно забыто)? Если второе, то как исправить?


person David Hammen    schedule 16.06.2011    source источник
comment
Несколько плюсов, один минус (без комментариев?), но пока нет ответов или комментариев. Есть ли у кого-нибудь из участников переполнения стека способ связи с командой разработчиков gcc?   -  person David Hammen    schedule 17.06.2011


Ответы (1)


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

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

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

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

Удачи.

person David Seiler    schedule 17.06.2011
comment
Спасибо за ответ. Я добавил в отчет об ошибке. Краткосрочный ответ, очевидно, жить с этим. Наш продукт представляет собой библиотеку C++, основное предназначение которой заключается в среде моделирования с автокодированием. Поскольку это наша предполагаемая цель, многие наши тесты выполняются в этой среде. Последнее воплощение этой среды создает глобальные статические данные. У нас также есть возможность модульного тестирования, которая обходит эту среду. Таким образом, очевидное решение — потребовать от разработчиков разработки модульных тестов ctor_dtor. (Что я и сделал, и я уже слышу ворчание.) - person David Hammen; 17.06.2011