sigsegv произошел, когда posix_memalign сразу после освобождения на некоторых устройствах и опция компиляции в AIX - PullRequest
0 голосов
/ 12 февраля 2019

Я был назначен на указатель, и он сразу был свободен, но sigsegv возникает в зависимости от некоторых устройств и параметров xlc.

xlC_r -o cc.o cc -lhm имеет место sigsegv, но xlC_r -o cc.o cc работает.

(опция lhm связывает libhm.a libhu.a.)
(malloc и free works. Произошли только 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 ++ для 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 IBMXL C / C ++ для AIX, V10.1 Версия: 10.01.0000.0008
aix5.3 tl9 IBM XL C / C ++ для 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.
Знаете ли вы обходной путь или как его решить?

1 Ответ

0 голосов
/ 12 февраля 2019

libhm и libhmd являются библиотеками управления отладочной памятью.Они обнаруживают ошибки, сохраняя дополнительную информацию после malloc, а затем проверяют перед освобождением, что блок ранее не был освобожден и что он был выделен через malloc.Эти библиотеки не обрабатывают posix_memalign и не хранят дополнительную информацию для него.Поэтому, когда вы вызываете free после posix_memalign, они думают, что вы пытаетесь освободить память, которая была выделена неправильно.Тем не менее, я не припоминаю, что это вызвало ошибку сегментации, но было ошибочное сообщение об ошибке.(Я больше привык к libhmd, чем к libhm.)

Эти библиотеки больше не поддерживаются.См., Например, страницу руководства XLF для них.Официальная рекомендация состоит в том, чтобы использовать вместо AIX собственный инструмент отладки malloc .

...