使用带有无法识别的长选项的“getopt_long”时出现分段错误

Posted

技术标签:

【中文标题】使用带有无法识别的长选项的“getopt_long”时出现分段错误【英文标题】:Segmentation fault when using `getopt_long` with an unrecognized long option 【发布时间】:2019-04-06 20:04:32 【问题描述】:

我在我的新程序中使用了getopt_long 函数。 通过有效的长选项时它运行良好。但是,如果我尝试使用无效选项(即--unknown)调用程序,则会停止执行,说明发生了分段错误。完整的命令是program version --unknown

我需要在哪里更改代码才能让我的程序再次运行? (注意:传递无效的short选项也可以)

这是一个命令行程序。它需要接收子命令作为其第一个参数和特定于每个子命令的选项。我想添加对长选项的支持,因为使用短选项真的很困难。

char* subcommand = /* ... */;
int option_char = 0;
int exit_code = 0;

/* ... */
// Note: argv should be an array of strings containing the command-line arguments
int pm_parse_arguments(int argc, char** argv) 
    opterr = 0;
    if(strcmp(subcommand, "version") == 0) 
        return pm_parse_version_arguments(argc, argv);
     else 
        // No recognized subcommand
        pm_global_unrecognized_subcommand(subcommand);
    
    return exit_code;


int pm_parse_version_arguments(int argc, char** argv) 
    // List of long options
    struct option long_options[] = 
        "help",        no_argument, 0, 'h',
        "major",       no_argument, 0, 'm',
        "minor",       no_argument, 0, 0,
        "revision",    no_argument, 0, 'r',
    ;

    // Index of option
    int option_index = 0;

    while((option_char = getopt_long(argc, argv, ":hmr", long_options, &option_index)) != -1) 
        switch(option_char) 
            /* ... */
        
    return exit_code;

当传递长选项--unknown 时,它应该打印Unrecognized option: --unknown,就像短选项一样。而是返回分段错误。

这里是详细模式下的full output log of Valgrind。

【问题讨论】:

【参考方案1】:

getopt_long 要求长选项数组以零选项结构终止(类似于字符串以空值终止的方式)。否则,它不知道有多少。

【讨论】:

我在长选项数组中添加了零选项结构,它解决了我关于分段错误的问题,谢谢!请注意,可以使用 NULL 结构,而不是归零的选项结构。 这不是一个“空结构”; C 中没有这样的东西。NULL 被定义为 0,它会进行零初始化。

以上是关于使用带有无法识别的长选项的“getopt_long”时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

getopt_long()备忘

getopt_long 函数

使用 MinGW 编译 - 无法识别的命令行选项

使用带有两个参数的 UIButton addTarget 时无法识别的选择器

R gputools:gcc:错误:无法识别的命令行选项'-Wp'

NSInvalidArgumentException setSizeHasBeenSet 无法识别的选择器 - 带有属性文本