在AIX上运行代码时,出现未知且突然的分段错误。以下行:
sourceSample +=value;
给出分段错误。这里的sourceSample是指向图像的指针。
我对上面的代码行做了一些更改,出现了以下情况:
int *p = sourceSample; sourceSample = p + value;
分段故障持续存在。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来删除所有优化,则汇编代码完全可以,并且不存在分段错误。