Предотвращает ли автоматическая регистрация в Google Test статический порядок инициализации?
При использовании Google Test с C++11, если тесты определены для отдельных модулей компиляции, уязвим ли механизм автоматической регистрации для статического порядка инициализации?
Если нет, то почему нет?
ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ:
В частности: насколько я понимаю, стандарт позволяет инициализировать статические члены тестовых классов в других единицах компиляции после входа в main()
,
UnitTest::GetInstance()
метод гарантирует, что UnitTest
реестр создается при первом доступе. Но что останавливает этот первый доступ, так это вызов основного Run()
метод из main()
До того, как какие-либо тесты будут зарегистрированы?
Возможно, ключ в том, что они являются статическими членами класса, а не статическими свободными переменными?
2 ответа
Согласно этому ответу на эквивалентный вопрос, ответ:
Да, механизм автоматической регистрации в Google Test уязвим к фиаско статического порядка инициализации.
Если тесты определены в других единицах компиляции, зарегистрированы ли они ранее RUN_ALL_TESTS()
вызывается зависит от конкретного поведения компилятора.
Каждый TEST
макрос раскрывается в тестовый класс со статическим полем, которое будет инициализировано с помощью вызова MakeAndRegisterTestInfo()
который получит доступ к реестру тестов в статической переменной в функциональной области в UnitTest::GetInstance()
, Эта переменная будет инициализирована при первом использовании, и реестр тестов будет правильно регистрировать тесты один за другим, даже если порядок регистрации тестов не определен, поскольку они регистрируются при инициализации соответствующих статических полей.