lcov: охват исходного кода для нескольких исполнений

#c #gcov #lcov

#c #gcov #lcov

Вопрос:

  1. Я создал простое приложение hello word cpp.
  2. Скомпилировал его, передав gcc —флаг покрытия
  3. Выполнил исполняемый файл
  4. Сгенерированное покрытие путем вызова
    lcov --directory . --capture --output-file ic.info
  5. Сгенерированный отчет на основе html с помощью genhtml
    genhtml -o html/ ic.info

Теперь вопрос. Независимо от того, сколько раз я запускаю исполняемый файл, я всегда получаю один и тот же результат, то есть одинаковое покрытие строк и функций. Должно ли это увеличивать покрытие строки для каждого выполнения? Я что-то не так понимаю?

Если lcov генерирует покрытие только для одного выполнения, то как я могу сгенерировать покрытие для всех выполненных мной исполнений?

Комментарии:

1. Это может быть глупый вопрос, но: вы каждый раз запускаете свой код с разными входными данными, верно?

2. На самом деле это увеличивает количество выполнений для каждой строки … но что для раздела попадания???

3. Я выполняю без какого-либо ввода… как обстоит дело с входными данными? Разве они не суммируются?

4. Если вы запускаете свою программу с одним и тем же вводом (или без него), следующий путь кода будет точно таким же каждый раз, если у вас нет зависящего от времени поведения, использования случайных значений или какого-либо другого источника внешних данных, которые могут отличаться (или кода с ошибками / неопределенным поведением). Ожидается, что выходные данные покрытия должны быть на 100% идентичными для всех запусков, если глобальный набор входных данных фиксирован.

Ответ №1:

Я думаю, вы неправильно понимаете, как генерируются результаты покрытия. lcov не генерирует покрытие, как указано в вашем вопросе. Он обрабатывает только результаты покрытия, которые генерируются при запуске вашей программы (шаг 3 в вашем вопросе).

Итак, при многократном выполнении программы (шаг 3) время выполнения вашей строки увеличится (покрытие не обязательно). Чтобы увидеть это, вы можете создать несколько отчетов о покрытии (выполнить шаги 3,4 и 5 несколько раз). Вы увидите увеличение времени выполнения строк в вашем коде в отчетах, созданных на шаге 5.