Как предотвратить исключение функций из профилирования покрытия?
Мы используем профилировщик покрытия AQTime для проверки результатов покрытия для модульных тестов. Кажется, что в целом все работает хорошо, но имеет неприятную привычку переоценивать охват, потому что некоторые функции вообще не отображаются. Я думаю, что это потому, что компоновщик лишил их, потому что они не вызваны, но, очевидно, это не идеально, потому что я хотел бы, чтобы они отображались как "не охваченные".
Кто-нибудь знает, есть ли способ настроить Visual C++ или AQTime так, чтобы эти функции были правильно помечены как "не охваченные"?
2 ответа
AQtime получает список подпрограмм из отладочной информации модуля. Поскольку компоновщик удалил некоторые подпрограммы, для них нет отладочной информации, и AQtime не "видит" их.
Как правило, все линкеры имеют возможность включить / отключить эту функцию. Например, в проекте Visual C++ эта опция называется References и находится под Linker | Оптимизация свойств группы. Удалите значение этого параметра или задайте для него значение Нет (/OPT:NOREF) в конфигурации отладки вашего приложения, и компоновщик не удалит неиспользуемые функции. Опция задокументирована здесь.
Странный. Независимо от того, удаляет ли их компилятор / компоновщик, факт заключается в том, что в конце выполнения теста нет записей об их выполнении. Таким образом, если инструмент может перечислить все функции, у него не должно быть таких доказательств, и поэтому он должен сообщать "не выполнено".
Наш инструмент тестирования покрытия SD C++ не имеет такого причудливого поведения, по крайней мере, если вы на самом деле не указываете, что содержащий модуль компиляции или заголовочный файл являются частью тех, которые должны быть инструментированы. (Вы можете не перечислить заголовочный файл, который содержит тело функции, и о нем не будет сообщено). Он даже сообщит, что функция, которая была встроена, была выполнена независимо от количества мест, где она была встроена.