【问题标题】:incredible program crash call stack [duplicate]令人难以置信的程序崩溃调用堆栈[重复]
【发布时间】:2017-06-29 10:24:57
【问题描述】:

我在 C 语言中有一个令人难以置信的段崩溃调用堆栈,有人可以帮我吗?

int function(struct A *a) 
{
    ... some other declare
    struct B *b = a->b;
    int count, len;
    ... some other declare
    struct C *c = b->c;  /* not crash here */
    ....some other decalre

    if (b->e) { /*crash log indicate b is NULL and crash here,first line instrucment code*/
    .....
    }
    ....
}

我的问题是为什么崩溃没有发生在struct C *c = b->c

GCC 是编译器。

托尼

【问题讨论】:

  • 你有没有看到任何可以保证文档中“崩溃”的东西?
  • 访问无效指针是未定义的行为。编译器没有义务保证一旦遇到 UB 就会崩溃。根据定义,UB 意味着行为是不可预测的。
  • 什么是令人难以置信的片段?我想了解更多关于这些的信息!
  • if (b->e) 后面的代码将使用 c。如果 b 是一个空指针,我认为它应该在 c = b->c 崩溃,而不是在下面的代码中,我之前遇到过这样的崩溃,使用相同的编译器参数。

标签: c


【解决方案1】:

除非存在数据流依赖性,否则编译器不保证指令的有序执行。它有许多优化,其中之一是data flow optimization

另外,如果你根本不使用变量c,编译器会从代码中优化它(dead code optimization),你可能根本看不到崩溃(如果程序的其余部分工作正常)很好)。

了解正在发生哪种优化的一种简单方法是在某处访问c 变量。另一种方法是禁用优化(GCC 中的-O0)。

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2013-01-06
    相关资源
    最近更新 更多