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