如何覆盖不直观的代码块?

时间:2010-04-13 17:10:11

标签: c unix

出于某种原因,我很难尝试覆盖下面的代码块。此代码摘自UNIX uniq命令。我正在尝试编写测试用例来覆盖所有块,但似乎无法达到此块:

if (nfiles == 2)
{
    // Generic error routine
}

在上下文中:

int main (int argc, char **argv)
{
    int optc = 0;
    bool posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
    int nfiles = 0;
    char const *file[2];

    file[0] = file[1] = "-";
    program_name = argv[0];

    skip_chars = 0;
    skip_fields = 0;
    check_chars = SIZE_MAX;

    for (;;)
    {
        /* Parse an operand with leading "+" as a file after "--" was
        seen; or if pedantic and a file was seen; or if not
        obsolete.  */

        if (optc == -1 || (posixly_correct && nfiles != 0) || ((optc = getopt_long (argc, argv, "-0123456789Dcdf:is:uw:", longopts, NULL)) == -1))
        {
            if (optind == argc)
                break;
            if (nfiles == 2)
            {
                // Handle errors
            }
            file[nfiles++] = argv[optind++];
        }
        else switch (optc)
        {
            case 1:
            {
                unsigned long int size;
                if (optarg[0] == '+' && posix2_version () < 200112 && xstrtoul (optarg, NULL, 10, &size, "") == LONGINT_OK && size <= SIZE_MAX)
                    skip_chars = size;
                else if (nfiles == 2)
                {
                    // Handle error
                }
                else
                    file[nfiles++] = optarg;
            }
            break;
        }
    }
}

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:0)

在命令行上提供的文件超过2个时,似乎可以达到此目的。在这种情况下,nfiles将在file[1]中存储第二个文件的名称后达到值2。当代码检查nfiles == 2到达第三时间时,该值将已经为2,并且将执行错误处理。

有两个if个陈述有问题。仅在longopts中使用 val == 1 的选项才能达到切换情况“1”。

答案 1 :(得分:0)

我只是认为我会顺便提一下,自动生成满足覆盖标准的测试用例正在从一个研究课题转变为有用的应用程序。我所知道的一个原型是PathCrawler

源代码中可能阻止此工具或类似工具按预期工作的困难是常见的嫌疑:别名和动态内存分配。