【问题标题】:getopt_long_only segmentation faultgetopt_long_only 分段错误
【发布时间】:2011-07-18 04:40:06
【问题描述】:

我正在尝试使用 getopt_long_only 来解析命令行。我的应用会读取一些命令行选项。

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

只要传入有效的命令行参数,getopt_long_only 就可以正常工作。但是,如果您在末尾和其他不适当的地方使用无效的“单虚线”选项调用应用程序,则会发生 seg fault 崩溃。这里发生了什么?似乎 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;
}

【问题讨论】:

  • int index;改成int index = 0;还会崩溃吗?
  • 感谢 1of1。当我这样做时,它确实停止了崩溃。这没有任何意义......所以我在手册页上进行了更深入的研究。这让我发现我忘记正确地终止数组中的最后一行。

标签: linux command-line getopt


【解决方案1】:

我发现了问题。

我忘记在我的选项数组声明的末尾有一个“零行”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多