Как мне сказать gcov игнорировать нечитаемые строки кода C ++? - PullRequest
42 голосов
/ 24 августа 2010

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

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

Ответы [ 4 ]

34 голосов
/ 20 января 2011

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

Из geninfo (1):

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

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

Инструмент под названием gcovr может использоваться для суммирования вывода gcov, и ( по крайней мере из версии 3.4 ) он поддерживает те же маркеры исключения, что и lcov.

С этот ответ :

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

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

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

1 голос
/ 24 августа 2010

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

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

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

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

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

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

0 голосов
/ 24 августа 2010

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

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

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

...