【问题标题】:AIX: Unknown Segmentation fault issueAIX:未知分段错误问题
【发布时间】:2017-05-22 15:07:28
【问题描述】:

在 AIX 上运行我的代码时,我遇到了未知且突然的分段错误。以下行:

sourceSample +=value;

给出分段错误。这里的 sourceSample 是一个指向图像的指针。

我对上面的代码行做了一些修改,结果如下:

  1. int *p = sourceSample; sourceSample = p + value;Segmentation 错误仍然存​​在。

  2. int **p = &sourceSample; sourceSample = *p + value; 没有分段错误,代码执行成功。

谁能告诉我为什么会这样?

ps:这是我对 StackOverflow 的第一个问题,如果我遗漏了什么,请见谅。

【问题讨论】:

  • 您错过的是发布您的代码的整个相关摘录,这使我们能够重现问题。另见:minimal reproducible example
  • 您是否知道 (a) 原始源代码行试图做什么,以及 (b) 您所做的这些更改实际上是什么意思 以及它们有何不同?如果没有,我现在就告诉你:猜测不是你学习编程的方式。
  • 在符合标准的 C++ 实现上运行的 C++ 程序出现分段错误的唯一方法是让该程序表现出未定义的行为。我们需要一个minimal reproducible example 来确定未定义的性质,但一个合理的可能性是sourceSample + value 将指向sourceSample 指向的对象的边界之外。尝试计算这样的指针值足以产生未定义的行为;从技术上讲,您不需要取消引用结果。
  • 整个相关代码摘录非常大,分配内存和使用内存的点非常不同。如果我尝试从整个代码库中发布一个简短的摘录,那将毫无意义。我知道没有代码摘录是不可能重现问题的,但我想问的不是为什么会出现这种分段错误,而是我的第二个更改是如何解决分段错误的?
  • @VarunKalra 但是我的第二个更改是如何解决分段错误的? -- 一些建议 -- 如果您知道您添加的代码“解决了问题”,并且代码本身与该问题无关,但不知何故,看似神奇地“修复了问题”,这清楚地表明了内存损坏。我建议删除神奇地解决问题的行,将错误放回程序中,然后真正解决问题。您所做的只是用无所事事的代码行来掩盖问题,这无法解决。

标签: c++ segmentation-fault aix


【解决方案1】:

我找到了问题的问题。 问题是因为在 AIX 中生成了错误的汇编代码。在使用以下方法添加“值”后尝试访问 sourceSample 时发生分段错误:

if(bitPos == bitPos_renew) {
    sourceSample += value;
}

当 'value' 添加到 sourceSample 指针并尝试访问 sourceSample 时,AIX 会引发分段错误。这是因为变量“值”中的值错误。

'value' 的值是通过以下方式分配的:

value = sx <= ex ? 1 : -1;

分配给它的值应该是 1 或 -1 但是当我们在汇编代码中看到分配给引用变量“值”的 64 位寄存器的值是

00000000FFFFFFFF

而不是

FFFFFFFFFFFFFFFF(-1)

因此,当 'value' 添加到 sourceSample 时,它​​开始指向一些未分配的内存,从而导致分段错误。

当我尝试打印变量“value”的值时,汇编代码会自动正确并成功运行。

这是因为编译器的优化。如果我通过将优化级别设置为 O0 来删除所有优化,则汇编代码完全没有问题,并且没有分段错误。

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2010-12-03
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多