2016-12-03 18 views
0

Я начал использовать Gcov для анализа моих программ на C. Поэтому во введении документации GCov я читал: «потому что gcov накапливает статистику по строке (при самом низком разрешении), он лучше всего работает с стилем программирования, который помещает только одну инструкцию в каждую строку». Как я могу избежать ограничений GCov на стиль кодирования?

Написал тривиальные программы, я заметил проблемы при вычислении количества раз, когда выполняется инструкция, содержащаяся в предложении «for».

Я собираюсь показать вам два примера и выход GCov из них:

-: 0:Source:example1.c 
    -: 0:Graph:example1.gcno 
    -: 0:Data:example1.gcda 
    -: 0:Runs:1 
    -: 0:Programs:1 
    -: 1:#include <stdio.h> 
    -: 2:#include <stdlib.h> 
    -: 3: 
    -: 4: 
    1: 5:int main() 
    -: 6:{ 
    1: 7: int i = 0; 
    -: 8: 
    1: 9: for(; i < 4; i++); 
    -: 10: 
    1: 11: return 0; 
    -: 12:} 
    -: 13: 

GCov подсчитывает для статьи в качестве единственного элемента. Это не так? Как рассказал документации GCov рассчитывает правильно количество раз, что заявления в течение п выполняются, если я поставлю их на одной линии, как в этом примере:

-: 0:Source:example1.c 
    -: 0:Graph:example1.gcno 
    -: 0:Data:example1.gcda 
    -: 0:Runs:1 
    -: 0:Programs:1 
    -: 1: 
    -: 2:#include <stdio.h> 
    -: 3:#include <stdlib.h> 
    -: 4: 
    -: 5: 
    1: 6:int main() 
    -: 7:{ 
    1: 8: int i = 0; 
    -: 9: 
    6: 10: for(; 
    -: 11:  i < 4; 
    4: 12:  i++); 
    -: 13: 
    1: 14: return 0; 
    -: 15:} 
    -: 16: 

Мы что (я = 0) выполняется 1 время, (i < 4) 5 раз и (i ++) 4 раза. Это правильно для меня.

У меня есть два вопроса:

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

2 Существуют ли другие конструкции, которые имеют одинаковую проблему для цикла «для»?

Заранее благодарим за ответы.

ответ

0

Нет ничего плохого в том, что стиль кодирования используется здесь.
Аннотированный вывод gcov показывает его как выполненный один раз, потому что он был оптимизирован компилятором, поскольку компилятор видит ; в конце for, он преобразует его в одно назначение. Таким образом, вместо прохождения цикла в 5 шагов он просто присваивает значение и выходит из него.
Вы должны попробовать то же самое, как это:

int i=0; 
for(; i < 4; i++) 
    printf("%d", i) 

Если попробовать это вы получите правильный подсчет выполнения для каждого оператора.
Так что мне не нужно адаптировать какое-либо конкретное соглашение о кодировании, но избегайте писать группу операторов в одной (ни одна из них вообще не работает), это все.

+1

Извините за поздний ответ. Но я еще не убежден. GCov считает, что «для» написано на вашем пути как уникальный оператор. Я получаю 5 от профилирования. – vnzstc