Как сказать GCOV, чтобы игнорировать неверные строки кода C ++?

StackOverflow https://stackoverflow.com/questions/3555083

  •  30-09-2019
  •  | 
  •  

Вопрос

Я использую GCO для измерения покрытия в моем C ++. Я хотел бы добраться до 100% покрытия, но меня поражен тем, что существуют некоторые строки кода, которые теоретически не хитрые (методы, которые необходимы для реализации, но которые никогда не вызываются, ветви по умолчанию switch заявления и т. Д.). Каждая из этих ветвей содержит assert( false ); Заявление, но GCOV все еще отмечает их как невыразиться.

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

Это было полезно?

Решение

Пожалуйста, используйте LCOV. Он скрывает сложность GCOV, производит хороший выход, позволяет детально выводить на тест, функционирует простым файловым фильтрацией и - Ta-Taa - линейные маркеры для уже рассмотренных линий:

От Geninfo (1):

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

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

Другие советы

Инструмент называется GCOVR Может использоваться для суммирования вывода GCOV и (от хотя бы версии 3.4) Он поддерживает те же маркеры исключения, что и ЛГОВ.

От Этот ответ:

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

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

Вы также можете заменить 'LCOV' выше с 'GCOV' или 'GCOVR'. Отказ Все они работают.

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

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

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

Предположительно, что он в настоящее время говорит, находится вдоль линий «Все выключатели должны иметь случай по умолчанию». Но это означает, что стандарты кодирования мешают наблюдаемым поведению (по меньшей мере, наблюдаемым под GCOV) путем введения Dead Code. Стандарты кодирования не должны делать это, поэтому функциональный SPEC должен учитывать стандарты кодирования, если это возможно.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top