13

コマンドラインを解析するために getopt_long_only を使用しようとしています。私のアプリは、いくつかのコマンド ライン オプションを読み取ります。

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

getopt_long_only は、有効なコマンド ライン パラメーターが渡されている限り、期待どおりに正常に機能します。ただし、無効な「一重破線」オプションを末尾やその他の不適切な場所で使用してアプリを呼び出すと、セグ フォールト クラッシュが発生します。何が起きてる?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;
}
4

1 に答える 1

19

問題が見つかりました。

オプション配列宣言の最後に「ゼロ行」があるのを忘れていました。

option longopts[] = {
    {"alpha", optional_argument, 0, 0},
    {"beta",  optional_argument, 0, 0},
    {"cecil", optional_argument, 0, 0},
    {NULL, 0, 0, 0}
};
于 2011-07-18T04:56:21.990 に答える