在某些设备和AIX中的compile选项中释放posix_mealigent后立即发生sigsegov

sigsegv occured when posix_memalign immediately after free in some devices and compile option in AIX

本文关键字:mealigent posix sigsegov 释放 AIX 选项 compile 中的      更新时间:2023-10-16

我被分配给一个指针,它立即空闲,但sigsegov的出现取决于一些设备和xlc选项。

xlC_r-o cc.o c.c-lhm发生sigsegov,但xlC_r/o cc.o c.c有效。

(lhm选项正在链接libhm.a-libhu.a.)
(malloc和free有效。只有posix_memalign和free-sigsegv出现。)

源代码:

#include<stdlib.h>
#include<stdio.h>
int main()
{
void * sPtr = NULL;
size_t sAlign = 8388608;
size_t sSize = 8388648;
int sRet = 0;
sRet = posix_memalign(&sPtr, sAlign, sSize);
printf( "after malloc : %p return : %dn", sPtr, sRet );
free(sPtr);
printf( "after freen" );
return 0;
}

它起作用:

aix7.1 tl3 IBM XL C/C++for AIX,V12.1(5765-J02、5725-C72)版本:12.01.000.0000
aix6.1 tl9 IBM XL C/C++for AIX,V10.1版本:10.01.000.0008

结果是:

after malloc : 22000000 return : 0
after free

但是

aix6.1 tl3 IBM XL C/C++for AIX,V10.1版本:10.01.000.0008
aix5.3 tl9 IBM XL C/CC++for AIX,V10.1版本:10.01.00 0.0000
aix5.3 tl1 C for AIX 6.0.0.0版本:10.01.000.0000

结果是

after malloc : 22000000 return : 0
Segmentation fault (core dumped)
% dbx cc.o core
Type 'help' for help.
[using memory image in core]
reading symbolic information ...
Segmentation fault in _ufree at 0xd3c0fcc4 ($t1)
0xd3c0fcc4 (_ufree+0x44) 80be0000         lwz   r5,0x0(r30)
(dbx) where
_ufree(??) at 0xd3c0fcc4
cbase.free(??) at 0xd2b7c048
main(), line 16 in "c.c"

尽管我已经试了一个多星期了,但我还没有解决这个问题。我从AIX中搜索了一个错误报告,但找不到。

不可能同时删除posix_memalign和lhm选项
您知道变通方法或如何解决吗?

libhm和libhmd是调试内存管理库。他们通过在malloc之后保留额外的信息来检测错误,然后在释放之前检查块之前是否没有被释放,以及它是通过malloc分配的。这些库不处理posix_meagn,也不为其保留额外的信息。因此,当您在posix_meign之后调用free时,它们认为您试图释放未正确分配的内存。也就是说,我不记得这会导致分割错误,而是误报错误信息。(我更习惯libhmd而不是libhm。)

这些库已不再维护。例如,请参见XLF编译器手册页。官方建议使用AIX的本机调试malloc工具。