Как покрыть неинтуитивные блоки кода? - PullRequest
1 голос
/ 13 апреля 2010

По какой-то причине у меня возникают трудности с попыткой охватить блок кода ниже. Этот код является выдержкой из команды 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 голосов
/ 13 апреля 2010

Я просто подумал, что мимоходом упомяну, что автоматическая генерация тестовых случаев для удовлетворения критериям покрытия превращается из темы исследования в полезные приложения. Один из известных мне прототипов - PathCrawler .

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

0 голосов
/ 13 апреля 2010

Похоже, это может быть достигнуто, если в командной строке указано более 2 файлов. В этом случае nfiles достигнет значения 2 после того, как имя второго файла будет сохранено в file[1]. Когда проверка кода nfiles == 2 будет достигнута третий раз, тогда значение будет уже равно 2, и обработка ошибок будет выполнена.

Имеется два if рассматриваемых утверждения. В случае переключателя «1» может быть достигнуто только с помощью опции в longopts с val == 1 .

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