SIGSEGV在一些设备中自由后立即posix_memalign和AIX编译选项时发生

问题描述 投票:1回答:1

我被分配到一个指针,它立即是免费的,但是,在某些设备和XLC选项出现SIGSEGV。

xlC_r -o cc.o C.C -lhm已SIGSEGV发生,但xlC_r -o cc.o C.C作品。

(LHM选项联的libc.a libhu.an。) (malloc和free的作品。只有posix_memalign和自由发生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 : %d\n", sPtr, sRet );
    free(sPtr);

    printf( "after free\n" );
    return 0;
}

有用:

AIX7.1 TL3 IBM XL C / C ++用于AIX,V12.1(5765-J02,5725-C72)版本:12.01.0000.0000 AIX6.1 TL9 IBM XL C / C ++用于AIX,V10.1版本:10.01.0000.0008

结果是:

after malloc : 22000000 return : 0
after free

AIX6.1 TL3 IBM XL C / C ++用于AIX,V10.1版本:10.01.0000.0008 AIX5.3 TL9 IBM XL C / C ++用于AIX,V10.1版本:10.01.0000.0000 为AIX版本6.0.0.0版本AIX5.3 TL1 C:10.01.0000.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的bug报告,但我找不到一个。

这是不可能同时删除posix_memalign和LHM选项。 你知道解决方法或如何解决呢?

c++ c aix sigsegv xlc
1个回答
2
投票

libhm和libhmd正在调试的内存管理库。他们通过的malloc后保持额外的信息,然后该块以前没有被释放之前免费检查,并且它是通过的malloc分配的检测错误。这些库不处理posix_memalign和不保留额外的信息吧。所以,当你posix_memalign后拨打免费的,他们认为你正试图释放不是正确分配内存。这就是说,我不记得,引起分段错误,但假阳性的错误消息。 (我更习惯比libhm到libhmd。)

这些库不再保留。例如,见他们的XLF compiler manual page。官方的建议是使用AIX的本地debug malloc tool代替。

© www.soinside.com 2019 - 2024. All rights reserved.