如何修改返回值?

时间:2013-03-11 12:51:36

标签: c gdb low-level gsoap

我有例行调用gSoap API函数soap_malloc。但是每当我尝试访问segmentation fault分配的内存时,程序都会给我一个soap_malloc。当我使用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只是将第二个参数传递给mallocSOAP_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

的定义
static const char soap_padding[4] = "\0\0\0";
#define SOAP_NON_NULL (soap_padding)

更新( 2013年3月12日
我明确声明soap_mallocvoid *,问题解决了。以前,将结果分配给int时,返回的值将被截断为1并且符号位void *temp会被扩展。

1 个答案:

答案 0 :(得分:3)

调用代码是否具有适用于范围内soap_malloc()函数的原型?

似乎void *正在转换为int,即默认的返回类型。如果函数未正确声明,则会发生这种情况。