Подтвердить что ты не робот

Как я могу сказать gcov игнорировать un-hittable строки кода на С++?

Я использую gcov для измерения покрытия в моем коде на С++. Я бы хотел получить 100% -ный охват, но мне мешает тот факт, что есть некоторые строки кода, которые теоретически не допускаются (методы, которые должны быть реализованы, но которые никогда не вызываются, ветки по умолчанию switch заявления и т.д.). Каждая из этих ветвей содержит оператор assert( false );, но gcov по-прежнему отмечает их как un-hit.

Я хотел бы сказать gcov игнорировать эти ветки. Есть ли способ предоставить gcov эту информацию - путем аннотации исходного кода или каким-либо другим механизмом?

4b9b3361

Ответ 1

Пожалуйста, используйте lcov. Он скрывает сложность gcov, производит приятный вывод, позволяет получить подробный результат за каждый тест, имеет функцию легкой фильтрации файлов и - ta-taa-line маркеры для уже рассмотренных строк:

Из geninfo (1):

Следующие маркеры распознаются geninfo:

  • LCOV_EXCL_LINE
    • Линии, содержащие этот маркер, будут исключены.
  • LCOV_EXCL_START
    • Отмечает начало исключенного раздела. Текущая строка является частью этого раздела.
  • LCOV_EXCL_STOP
    • Помечает конец исключенного раздела. Текущая строка не входит в этот раздел.

Ответ 2

Не могли бы вы ввести модульные тесты соответствующих функций, которые существуют исключительно для того, чтобы закрыть gcov, непосредственно атакуя теоретически-непередаваемые кодовые пути? Поскольку они являются модульными тестами, они могут, возможно, игнорировать "невозможность" ситуаций. Они могут вызывать функции, которые никогда не вызываются, передавать недопустимые значения перечисления, чтобы улавливать ветки по умолчанию и т.д.

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

Я нахожу это немного странным, хотя для спецификации сказать, что код должен быть там, а не спецификация, содержащая функциональные требования к коду. В частности, это означает, что ваши тесты не проверяют эти требования, что также является хорошей причиной для того, чтобы поддерживать функциональность требований. Лично я хотел бы изменить спецификацию, чтобы сказать: "если вызвано с недопустимым значением перечисления, функция должна выйти из строя assert. Вызывающие не должны вызывать функцию с недопустимым значением перечисления в режиме деблокирования". Или некоторые из них.

Предположительно, что он говорит в настоящее время, по строкам "все операторы switch должны иметь случай по умолчанию". Но это означает, что стандарты кодирования мешают наблюдаемому поведению (по крайней мере, наблюдаемому при gcov) путем введения мертвого кода. Стандарты кодирования не должны делать этого, поэтому функциональная спецификация должна учитывать стандарты кодирования, если это возможно.

В противном случае вы могли бы поместить завершающий код в #if !GCOV_BUILD и сделать отдельную сборку для gcov. Эта сборка не даст вам некоторых требований, но при условии правильности вашего анализа кода, вы получите уверенность в том, что тестовый пакет проверяет все остальное.

Изменить: вы говорите, что используете генератор коварного кода, но вы также просите решение, комментируя исходный код. Если вы меняете источник, вы можете просто удалить мертвый код во многих случаях? Не то, чтобы изменение сгенерированного источника было идеальным, но потребности должны...

Ответ 3

Я не считаю, что это возможно. Gcov зависит от gcc для генерации дополнительного кода для получения результата покрытия. Сам GCov просто анализирует данные. Это означает, что Gcov не может анализировать код лучше, чем gcc (и я предполагаю, что вы используете -Wall и удалили код, сообщенный как недостижимый).

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

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