在OS X Mavericks上使用-O3进行编译时,Getopt代码会出现段错误

时间:2013-11-11 20:43:39

标签: c optimization segmentation-fault getopt

我最近注意到,在给出以双破折号开头的参数时,我编写了一些程序(使用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吗?

1 个答案:

答案 0 :(得分:2)

来自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如何知道数组中有多少元素”。手册确认。