Как мне увеличить покрытие кода? - PullRequest
0 голосов
/ 25 марта 2010

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

if (used_length == allocated_length)
{
     allocated_length += (1 << SWALLOW_REALLOC_LOG);
     block->start
    = (char *) xrealloc (block->start, allocated_length);
}

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

/* Reallocation step when swallowing non regular files.  The value is not
   the actual reallocation step, but its base two logarithm.  */
#define SWALLOW_REALLOC_LOG 12

static void swallow_file_in_memory (const char *file_name, BLOCK *block)
{
  int file_handle;      /* file descriptor number */
  struct stat stat_block;   /* stat block for file */
  size_t allocated_length;  /* allocated length of memory buffer */
  size_t used_length;       /* used length in memory buffer */
  int read_length;      /* number of character gotten on last read */

  /* As special cases, a file name which is NULL or "-" indicates standard
     input, which is already opened.  In all other cases, open the file from
     its name.  */
  bool using_stdin = !file_name || !*file_name || strcmp (file_name, "-") == 0;
  if (using_stdin)
    file_handle = STDIN_FILENO;
  else
    if ((file_handle = open (file_name, O_RDONLY)) < 0)
      error (EXIT_FAILURE, errno, "%s", file_name);

  /* If the file is a plain, regular file, allocate the memory buffer all at
     once and swallow the file in one blow.  In other cases, read the file
     repeatedly in smaller chunks until we have it all, reallocating memory
     once in a while, as we go.  */

  if (fstat (file_handle, &stat_block) < 0)
    error (EXIT_FAILURE, errno, "%s", file_name);

  if (S_ISREG (stat_block.st_mode))
    {
      size_t in_memory_size;

      block->start = (char *) xmalloc ((size_t) stat_block.st_size);

      if ((in_memory_size = read (file_handle,
                  block->start, (size_t) stat_block.st_size))
      != stat_block.st_size)
    {
        error (EXIT_FAILURE, errno, "%s", file_name);
    }
      block->end = block->start + in_memory_size;
    }
  else
    {
      block->start = (char *) xmalloc ((size_t) 1 << SWALLOW_REALLOC_LOG);
      used_length = 0;
      allocated_length = (1 << SWALLOW_REALLOC_LOG);

      while (read_length = read (file_handle,
                 block->start + used_length,
                 allocated_length - used_length),
         read_length > 0)
    {
      used_length += read_length;
      /* Cannot cover from this point...*/
      if (used_length == allocated_length)
        {
          allocated_length += (1 << SWALLOW_REALLOC_LOG);
          block->start
        = (char *) xrealloc (block->start, allocated_length);
        }
      /* ...to this point. */
    }

      if (read_length < 0)
    error (EXIT_FAILURE, errno, "%s", file_name);

      block->end = block->start + used_length;
    }

  /* Close the file, but only if it was not the standard input.  */

  if (! using_stdin && close (file_handle) != 0)
    error (EXIT_FAILURE, errno, "%s", file_name);
}

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Исходя из кода, кажется, что ваш ввод меньше 4096 (1 << SWALLOW_REALLOC_LOG) байтов. Увеличьте входные данные (и убедитесь, что вы предоставляете этот больший ввод не в виде простого файла, а через канал), и вам нужно нажать на этот код.

1 голос
/ 25 марта 2010

Чтобы максимизировать покрытие кода, вам нужно достичь 100% покрытия.

Во-первых, 100% цель, как правило, пустая трата времени. Обязательно используйте инструменты покрытия кода, чтобы помочь вам, но не зацикливайтесь на числе. Более важно тщательно тестировать определенные области вашего кода и сознательно пропускать другие части, а не распределять свои усилия по всей базе кода, независимо от ее важности.

Сказав это, чтобы получить покрытие в данном конкретном случае, вам нужно будет смоделировать метод read, чтобы вы могли контролировать, что он делает. Вам нужно использовать внедрение зависимостей для достижения этой цели. Другой метод может состоять в том, чтобы назначить буфер только одним байтом, заставляя эту ветвь быть занятой.

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