c++ - sigsegv 发生在 posix_memalign 在某些设备和 AIX 中的编译选项后立即释放时

标签 c++ c aix segmentation-fault xlc

我被分配到一个指针,它立即空闲,但 sigsegv 发生取决于某些设备和 xlc 选项。

xlC_r -o cc.o c.c -lhm 发生了 sigsegv,但 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 : %d\n", sPtr, sRet );
    free(sPtr);

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

有效:

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

结果是:

after malloc : 22000000 return : 0
after free

但是

aix6.1 tl3 IBM XL C/C++ for AIX,V10.1 版本:10.01.0000.0008
aix5.3 tl9 IBM XL C/C++ for AIX,V10.1 版本:10.01.0000.0000
aix5.3 tl1 C 用于 AIX 版本 6.0.0.0 版本: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 的错误报告,但找不到。

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

最佳答案

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

不再维护这些库。参见例如 XLF compiler manual page为他们。官方推荐使用AIX原生的debug malloc tool相反。

关于c++ - sigsegv 发生在 posix_memalign 在某些设备和 AIX 中的编译选项后立即释放时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54641936/

相关文章:

c - 这段代码中*first 打印的是什么?

c - 尝试与线程之间的套接字建立内部连接并连接失败

c - 如何在 unix 中创建阻塞文件描述符?

unix - 为 db2 客户端中的数据库指定默认模式

c++ - apache 上的 ap_log_error 转储从 apache 2.4 开始

c++ - 如何处理全局通用框架的不稳定 API

c++ - 使用散列等长比较的子字符串

宏中的 C++ 编译时间计数器

c++ - 添加 Q_OBJECT 宏在 QThread 继承类中给出 "unresolved external error"

unix - 使用 ed 添加文本到文件中特定行的末尾