Gcov сообщает о неожиданных результатах покрытия

Я внес некоторые изменения в библиотеку, чтобы она соответствовала проекту. Я провел тест, и все еще прошло, но покрытие уже не 100%. Я исследовал и увидел, что код выполняется, просто не сообщается. Но я понятия не имею, почему gcov не сообщает о покрытии строки во время ее выполнения.

Это код:

int32_t PreviouslyEncountered(uint32_t n)
{
  uint32_t i;

  /* Search thru all the numbers encoountered so far see if there is a match */
  for(i = 0; i < xcount; i++)
  {
    if(n == collection[i])
    {
      return 1; /* This value has been seen before */
    }
  }

  /* Add the number to encountered values if there is space */
  if(xcount < NUMBERTRACKERMAX )
  {
    collection[xcount] = n;
    xcount++;
  }
  else
  {
    return NUMBERTRACKERMAX ;
  }

  return 0;

} 

Это тест:

/* Fill with 10000 elements */
for(i = 0; i < NUMBERTRACKERMAX; i++)
{
  assert(PreviouslyEncountered(i) == 0);
}

/* Test that all 10000 elements are present */
for(i = 0; i < NUMBERTRACKERMAX; i++)
{
  assert(PreviouslyEncountered(i) == 1);
}

А это результаты покрытия:

       -:   51:int32_t PreviouslyEncountered(uint32_t n)
function PreviouslyEncountered called 201 returned 100% blocks executed 90%
     201:   52:{
     201:   53:  uint32_t i;
       -:   54:
       -:   55:  /* Search thru all the numbers encoountered so far see if there is a match */
   20101:   56:  for(i = 0; i < xcount; i++)
       -:   57:  {
   19900:   58:    if(n == collection[i])
       -:   59:    {
   #####:   60:      return 1; /* This value has been seen before */
       -:   61:    }
       -:   62:  }
       -:   63:
       -:   64:  /* Add the number to encountered values if there is space */
     201:   65:  if(xcount < NUMBERTRACKERMAX )
       -:   66:  {
     200:   67:    collection[xcount] = n;
     200:   68:    xcount++;
       -:   69:  }
       -:   70:  else
       -:   71:  {
       1:   72:    return NUMBERTRACKERMAX ;
       -:   73:  }
       -:   74:
     200:   75:  return 0;
       -:   76:
       -:   77:}

Добавление печати перед выполнением return 1;. Он не получил бы прикрытия, но теперь у return 1 было бы прикрытие. Есть идеи? кроме справочных страниц ничего не нашел.

Редактировать: Из комментариев видно, что я не все раскрыл. Я немного продвинулся в решении проблемы. Некоторые другие тесты других функций вызывают исчезновение обложки при их запуске. Выполнение только тестов для PreviouslyEncountered обеспечивает 100-процентное покрытие этой функции. Запуск других тестов сбрасывает это.


person Gerhard    schedule 18.08.2009    source источник
comment
Какая версия gcov и gcc и на какой платформе? Однако, пока вы более или менее в курсе, это вряд ли будет основным фактором.   -  person Jonathan Leffler    schedule 20.08.2009
comment
Почему функция выполняется 201 раз, хотя в комментариях указано, что NUMBERTRACKERMAX равно 10 000? Вы изменили его на 100 для тестирования? Откуда исходит странный вызов функции?   -  person Jonathan Leffler    schedule 20.08.2009
comment
Кроме того, если вы вызываете функцию 100 раз, чтобы добавить числа, а затем 100 раз, чтобы проверить наличие числа, почему вы добавляете числа 200 раз?   -  person Jonathan Leffler    schedule 20.08.2009
comment
Вы оптимизируете свой код (используя опцию «-O»)? Вы пробовали покрытие без оптимизации? Это имеет больше смысла?   -  person Jonathan Leffler    schedule 20.08.2009
comment
Я уменьшил NUMBERTRACKERMAX до 100 для тестирования. Я также подозревал оптимизацию, но по умолчанию GCC ее нет.   -  person Gerhard    schedule 26.08.2009
comment
gcc (GCC) 3.4.4 (специальный cygming) (gdc 0.12, используя dmd 0.125) gcov (GCC) 3.4.4 (специальный cygming) (gdc 0.12, используя dmd 0.125)   -  person Gerhard    schedule 26.08.2009


Ответы (1)


Я смог реорганизовать код, вызвавший проблему, поэтому я снова получаю 100% покрытие. Я понятия не имею, откуда взялась проблема. Может еще раз проверю.

person Gerhard    schedule 28.08.2009