gSoap
API 함수 soap_malloc
을 호출하고 있습니다. 그러나 soap_malloc
에 의해 할당 된 메모리에 액세스하려고 할 때마다 프로그램에서 내게 segmentation fault
을 제공합니다. 내가 gdb
을 사용하여 디버깅 할 때. 내 안에서 soap_malloc
안에, %rax
레지스터에 저장된 반환 값은 0x7fffec0018f0
입니다. 그러나 돌아 왔을 때 %rax
은 0xffffffffec0018f0
으로 변경되었습니다. 하위 32 비트 만 유지되었으며 더 높은 32 비트는 모두 1
으로 변경되었습니다. 그리고 그로 인해 상당히 높은 주소에 액세스하게되어 루틴이 중단되었습니다. 어떻게하면 이런 일이 벌어 질 수 있는지에 대한 아이디어를 나에게 모두 주셔서 감사합니다. 내 멀티 스레드 프로그램을 Ubuntu12.04 x86-64
에서 실행 중입니다.반환 값은 어떻게 수정 될 수 있습니까?
이 내가 그것을 호출하는 방법입니다
void *temp = soap_malloc(soap, 96);
그리고 이것은 soap_malloc
구현 (해당 else
부분이 실행되고, 매크로 SOAP_MALLOC
그냥 malloc
에 두 번째 인수를 전달하고, SOAP_CANARY
는 0xC0DE
일정) :
#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
이 확장되었습니다.
이 문제를 재현하는 최소한의 코드 예제를 제공 할 수 있습니까? –
일부 장소에서는 ** SOAP_MALLOC **를 사용하는 ** soap_malloc **을 사용합니다. ** SOAP_MALLOC **의 정의는 무엇입니까? 아니면 gSoap 라이브러리의 일부입니까? – Jere
@Jerenly'SOAP_MALLOC'은 두 번째 인수를'malloc'에 전달하는 매크로입니다. 죄송합니다. 코드 바디로 편집 할 것입니다. – leowang