getopt_long_only分段错误

sel*_*bie 13 linux command-line getopt

我正在尝试使用getopt_long_only来解析命令行.我的应用程序读取了一些命令行选项.

例如"app --alpha = 1 --beta = 2 --cecil = 3"

只要传入有效的命令行参数,getopt_long_only就可以正常工作.但是如果在末尾和其他不适当的位置调用带有无效"单个虚线"选项的应用程序,则会发生seg故障崩溃.这里发生了什么?似乎getopt_long_only对错误的参数没有弹性.或者我调用函数错了?

例:

> ./app --beta=1 -?
starting
index = 1   ret=0  optarg=1
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

下面的代码(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;
}
Run Code Online (Sandbox Code Playgroud)

sel*_*bie 19

我发现了这个问题.

我忘了在我的选项数组声明的末尾有一个"零行".

option longopts[] = {
    {"alpha", optional_argument, 0, 0},
    {"beta",  optional_argument, 0, 0},
    {"cecil", optional_argument, 0, 0},
    {NULL, 0, 0, 0}
};
Run Code Online (Sandbox Code Playgroud)