gcov и безусловное покрытие l oop - PullRequest
0 голосов
/ 06 августа 2020

Кто-нибудь знает, как gcov (для C и C ++) обрабатывает условные и безусловные циклы. В частности, если у вас есть условное l oop, вам нужно проверить 0, 1 или более для l oop. Если у вас есть безусловный l oop, никаких дополнительных тестов не требуется. Это связано с тем, что безусловный l oop всегда будет выполнять X количество раз, независимо от того, какой вход в l oop (подумайте о a для l oop, который всегда начинается с 0 и всегда заканчивается значением const).

Вопрос в том, как gcov (и связанные с ним инструменты отчетности) справляются с этим. Если al oop безусловный, нет возможности проверить 0, 1 или более. Учитывают ли эти инструменты это, чтобы не повлиять на общий% покрытия кода?

1 Ответ

0 голосов
/ 07 августа 2020

Инструмент может использовать разные типы покрытия, включая

  • покрытие строки
  • покрытие выписки
  • покрытие ветки / решения

для f1(); if (a || b) { f2(); } f3();

имеем:

  • 1 строка
  • 5 операторов (a, b, f1, f2 , f3)
  • 4 ветви (a==(true|false), b==(true|false) -> 2 + 2)
  • 3 пути ({a, b}=={true, _}, {a, b}=={false, false}, {a, b}=={false, true})

Нет реальных отношений между этими показателями

Один прогон будет проверять один путь и любое количество других показателей.

Ваше безусловное l oop (как for (int i : {4, 8, 15, 16, 23, 42})) действительно не увеличит количество путей, не увеличит количество ветвей на единицу и не увеличит количество операторов. Но любой путь, принимающий этот безусловный l oop, будет охватывать все операторы и ветви вашего безусловного l oop.

Ваш условный l oop (for (int i : my_numbers)) увеличит количество ветвей на единицу, может увеличиться номер пути (пустота контейнера уже исправлена ​​предыдущим шагом пути) и увеличить количество операторов. Если вы запустите путь с использованием непустого контейнера, вы охватите все операторы и ветви, но на самом деле не обязательно все пути.

Большинство инструментов не используют покрытие пути (поскольку оно слишком сильно увеличивается, чтобы его можно было использовать)

и условное против безусловного l oop имеет значение только для этих показателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...