【问题标题】:Getopt code segfaults when compiling with -O3 on OS X Mavericks在 OS X Mavericks 上使用 -O3 编译时出现 Getopt 代码段错误
【发布时间】:2013-11-11 20:43:39
【问题描述】:

我最近注意到我编写的一些程序(使用 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

【问题讨论】:

    标签: c optimization segmentation-fault getopt


    【解决方案1】:

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

    【讨论】:

    • 啊,谢谢!猜猜我真的应该正确地使用 RTFM。知道为什么它在没有优化的情况下工作吗?我现在正在查看生成的程序集的差异,但我无法找到它在未优化版本中工作的原因。
    • 第一个猜测是将零填充到下一个主要对齐;空间优化可能会被用于某些事情。
    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2017-11-02
    相关资源
    最近更新 更多