【问题标题】:What are some possible causes of program crashing when returning a value?返回值时程序崩溃的一些可能原因是什么?
【发布时间】:2013-03-19 19:48:53
【问题描述】:

我有一堆代码大致相当于这个:

bool test(double e, short a, short b, short c) {
    // Things being calculated here...
    cout << "debug_3" << endl;
    return (1 - abs(cos_th)) < (1 - cos(e));

}

int main() {

// something...

 cout << "debug_0" << endl;
        if(test(e,1,2,0)) {
            cout << "debug_4" << endl;
            // Bunch of useful operations...
        }

// something...

}

运行代码生成输出:

debug_3

之后程序崩溃(在 Windows 中显示“程序已停止工作...”)。我从来没有遇到过价值回报崩溃,我不知道是什么原因造成的,也不知道如何修复它。对这个问题有什么想法吗?

编辑:更多信息:

在我的构建中,我还验证了 cos_the 的值是否有效。

人们似乎指出第二件事是问题的根源,但当我通过调用 test()... 摆脱 if 语句时,我的问题似乎已解决(即没有崩溃)...

【问题讨论】:

  • 您可能不得不责怪“某事...”部分。什么是system,如何初始化?
  • 尝试在进行 printf 样式调试时将 cout 更改为 cerr(cerr 已刷新)。否则,请使用调试器来了解您的代码崩溃的确切位置。
  • 对于初学者,我会将 cos_th 和 e 放在 debug_3 的 cout 中。如果它们是 NaN 或 inf 之类的东西,则不确定 abs 和 cos 应该如何表现!
  • “我从未遇到过价值回报崩溃”——而且我没有看到任何证据表明这种情况正在发生。就我所见,最合乎逻辑的解释是aligned 返回false,你继续第二个//something 部分并且那里的东西崩溃了。
  • 正如 Zdeslav 所暗示的那样,如果对齐返回 false cout &lt;&lt; "debug_4" &lt;&lt; endl; 永远不会达到,因此您的程序在您没有看到 debug4 的情况下崩溃,即使崩溃可能发生在某些事情上。在if 之后放置另一个调试输出。或者尝试使用调试器并单步执行程序

标签: c++ crash return


【解决方案1】:

在不知道system 是什么的情况下,我们唯一可以解决的问题是将a bc 的类型更改为unsigned short,因为它们只是数组索引,并确保它们在范围内数组边界。您可能还需要确保它不为零,因为您除以结果:

sqrt((Xca*Xca+Yca*Yca+Zca*Zca)*(Xba*Xba+Yba*Yba+Zba*Zba))

使用cerr 而不是cout 确保输出已刷新,但您仍然看不到debug 4

在 else 条件内或 if 之后放置更多输出:也许函数返回 false?

如果无法准确定位错误,请使用调试器。

【讨论】:

    【解决方案2】:

    返回时崩溃通常意味着您的函数覆盖了堆栈(从而覆盖了返回地址)并且您的程序无处跳转。您可以通过在反汇编级别逐条指令来验证这一点。

    【讨论】:

    • 在这种情况下,该函数只写入 6 个局部变量并且不写入任何取消引用的位置,我认为它不会导致任何堆栈错误。我的猜测可能是数组访问的分段错误或除以零异常。
    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多