1

我最近注意到,当给定以双破折号开头的参数时,我编写的一些程序(使用 libgetopt)会出现段错误,例如--help.

我设法用以下小程序重现了这一点:

#include <getopt.h>

int main(int argc, char *argv[]) {
    // Parse arguments.
    struct option long_options[] = {
        { "test", required_argument, 0, 't' }
    };
    int option_index, arg;
    while((arg = getopt_long(argc, argv, "t:", long_options, &option_index)) != -1);

    return 0;
}

当我编译并运行它时,./a.out --help它工作正常。但是,一旦我使用-O3它进行编译,就会出现段错误。在 OS X Mavericks (10.9) 上使用 Apple LLVM 版本 5.0 (clang-500.2.79) 观察到此行为。

我能做些什么来解决这个问题,还是我应该避免-O3在未来使用?

4

1 回答 1

3

从 getopt_long 的手册页

 The last element of the longopts array has to be filled with zeroes.

所以你需要的是另一条线

struct option long_options[] = {
    { "test", required_argument, 0, 't' },
    { 0 } // this line is new
};

我怀疑是这种情况,因为我查看了您的代码并问:“getopt_long 如何知道数组中有多少元素”。手册页已确认。

于 2013-11-11T21:14:15.477 回答