ошибка сегментации getopt_long_only

Я пытаюсь использовать getopt_long_only для анализа командной строки. Мое приложение читает несколько параметров командной строки.

Например. "приложение --альфа=1 --бета=2 --cecil=3"

getopt_long_only работает нормально, как и ожидалось, если передаются допустимые параметры командной строки. Но если вы вызываете приложение с недопустимой опцией «один пунктир» в конце и в других неподходящих местах, происходит сбой seg. Что тут происходит? Похоже, что getopt_long_only не устойчив к ошибочно введенным аргументам. Или я неправильно вызываю функцию?

Пример:

> ./app --beta=1 -?
starting
index = 1   ret=0  optarg=1
Segmentation fault

Код ниже (C++: app.cc)

#include <stdio.h>
#include <getopt.h>

void ProcessCommandLineArgs(int argc, char** argv)
{

    option longopts[] = {
        {"alpha", optional_argument, 0, 0},
        {"beta",  optional_argument, 0, 0},
        {"cecil", optional_argument, 0, 0}
    };

    int index;
    int ret;
    bool fParseError = false;

    while (true)
    {
        ret = ::getopt_long_only(argc, argv, "", longopts, &index);

        if (ret < 0)
        {
            break;
        }

        if ((ret == '?') || (ret == ':'))
        {
            fParseError = true;
            break;
        }

        printf("index = %d   ret=%d  optarg=%s\n", index, ret, optarg?optarg:"<null>");
    }
}

int main(int argc, char** argv)
{
    printf("starting\n");
    ProcessCommandLineArgs(argc, argv);
    printf("exiting\n");
    return 0;
}

person selbie    schedule 18.07.2011    source источник
comment
Он по-прежнему падает, если вы измените int index; на int index = 0;?   -  person OneOfOne    schedule 18.07.2011
comment
Спасибо 1 из 1. Это действительно перестало падать, когда я это сделал. Что не имеет смысла... поэтому я углубился в справочную страницу. Это привело меня к тому, что я забыл правильно обнулить последнюю строку в массиве.   -  person selbie    schedule 18.07.2011


Ответы (1)


Я нашел проблему.

Я забыл поставить «нулевую строку» в конце объявления массива опций.

option longopts[] = {
    {"alpha", optional_argument, 0, 0},
    {"beta",  optional_argument, 0, 0},
    {"cecil", optional_argument, 0, 0},
    {NULL, 0, 0, 0}
};
person selbie    schedule 18.07.2011