AIX:未知分段故障问题

AIX: Unknown Segmentation fault issue

本文关键字:故障 问题 分段 未知 AIX      更新时间:2023-10-16

在AIX上运行代码时,出现未知且突然的分段错误。以下行:

sourceSample +=value;

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

我对上面的代码行做了一些更改,出现了以下情况:

  1. int *p = sourceSample; sourceSample = p + value;分段故障持续存在。

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

有人能告诉我为什么会发生这种事吗?

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

我发现了问题的症结所在。这个问题是因为在AIX中生成了错误的汇编代码。当它在使用向sourceSample添加"值"后尝试访问sourceSample时,会发生分段故障

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

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

"value"的值使用分配

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

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

00000000FFFFFFFF

而非

FFFFFFFFFFFFF(-1)

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

当我尝试打印变量"value"的值时,程序集代码会自动更正并成功运行。

这是因为编译器进行了优化。如果我通过将优化级别设置为O0来删除所有优化,则汇编代码完全可以,并且不存在分段错误。