大家好,以下是取自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);
}
谢谢先生。这是问题所在。我很感激。 – naivedeveloper 2010-03-25 02:17:53