2013-03-11 3 views
2

gSoap API 함수 soap_malloc을 호출하고 있습니다. 그러나 soap_malloc에 의해 할당 된 메모리에 액세스하려고 할 때마다 프로그램에서 내게 segmentation fault을 제공합니다. 내가 gdb을 사용하여 디버깅 할 때. 내 안에서 soap_malloc 안에, %rax 레지스터에 저장된 반환 값은 0x7fffec0018f0입니다. 그러나 돌아 왔을 때 %rax0xffffffffec0018f0으로 변경되었습니다. 하위 32 비트 만 유지되었으며 더 높은 32 비트는 모두 1으로 변경되었습니다. 그리고 그로 인해 상당히 높은 주소에 액세스하게되어 루틴이 중단되었습니다. 어떻게하면 이런 일이 벌어 질 수 있는지에 대한 아이디어를 나에게 모두 주셔서 감사합니다. 내 멀티 스레드 프로그램을 Ubuntu12.04 x86-64에서 실행 중입니다.반환 값은 어떻게 수정 될 수 있습니까?

이 내가 그것을 호출하는 방법입니다

void *temp = soap_malloc(soap, 96); 

그리고 이것은 soap_malloc 구현 (해당 else 부분이 실행되고, 매크로 SOAP_MALLOC 그냥 malloc에 두 번째 인수를 전달하고, SOAP_CANARY0xC0DE 일정) :

:
#ifndef SOAP_MALLOC   /* use libc malloc */ 
# define SOAP_MALLOC(soap, size) malloc(size) 
#endif 

#ifndef SOAP_CANARY 
# define SOAP_CANARY (0xC0DE) 
#endif 

void* soap_malloc(struct soap *soap, size_t n) 
{ register char *p; 
    if (!n) 
    return (void*)SOAP_NON_NULL; 
    if (!soap) 
    return SOAP_MALLOC(soap, n); 
    if (soap->fmalloc) 
    p = (char*)soap->fmalloc(soap, n); 
    else 
    { n += sizeof(short); 
    n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary */ 
    if (!(p = (char*)SOAP_MALLOC(soap, n + sizeof(void*) + sizeof(size_t)))) 
    { soap->error = SOAP_EOM; 
     return NULL; 
    } 
    /* set the canary to detect corruption */ 
    *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY; 
    /* keep chain of alloced cells for destruction */ 
    *(void**)(p + n) = soap->alist; 
    *(size_t*)(p + n + sizeof(void*)) = n; 
    soap->alist = p + n; 
    } 
    soap->alloced = 1; 
    return p; 
} 

SOAP_NON_NULL의 정의입니다 17,451,515,
static const char soap_padding[4] = "\0\0\0"; 
#define SOAP_NON_NULL (soap_padding) 

업데이트 (2013년 3월 12일는)
내가 명시 적으로 void *를 반환하고 문제가 해결로 soap_malloc을 선언했다. 이전에는 반환 된 값이 에 할당 될 때 int으로 잘리고 부호 비트 1이 확장되었습니다.

+0

이 문제를 재현하는 최소한의 코드 예제를 제공 할 수 있습니까? –

+0

일부 장소에서는 ** SOAP_MALLOC **를 사용하는 ** soap_malloc **을 사용합니다. ** SOAP_MALLOC **의 정의는 무엇입니까? 아니면 gSoap 라이브러리의 일부입니까? – Jere

+0

@Jerenly'SOAP_MALLOC'은 두 번째 인수를'malloc'에 전달하는 매크로입니다. 죄송합니다. 코드 바디로 편집 할 것입니다. – leowang

답변

3

범위의 soap_malloc() 함수에 대해 호출 코드에 적절한 프로토 타입이 있습니까?

void *int 즉 기본 반환 유형으로 변환 된 것으로 보입니다. 함수가 제대로 선언되지 않은 경우 발생합니다.

+0

죄송합니다. 호출 코드를'soap_malloc' 위에 놓아야합니다. 방금 반환 값을 저장하기 위해'void * temp'를 사용했습니다. – leowang

+0

@leowang 귀하의 수정 내용을 잘 모릅니다 ... 그건 중요하지 않습니다. 'void * p = malloc (1024)'와 같은 헤더를 포함하지 않고 일반 old'malloc()'*을 호출하면,'int' 크기의 결과를 얻게됩니다. '= '의 왼쪽에있는 타입은 중요하지 않습니다. – unwind

+0

죄송하지만 이해가 안됩니다. 'malloc '에 문제가 있습니까? 헤더 란 무엇을 의미합니까? – leowang