c - 如何修改返回值?

标签 c gdb low-level gsoap

我有一个调用 gSoap API 函数 soap_malloc 的例程。但每当我尝试访问由 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-03-12)
我明确声明 soap_malloc 作为返回 void * 并解决了问题。以前,在将结果分配给 void *temp 时,返回值被截断为 int 且符号位 1 被扩展。

最佳答案

调用代码是否具有作用域内 soap_malloc() 函数的正确原型(prototype)?

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

关于c - 如何修改返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15339062/

相关文章:

c - 共享内存不更新

javascript - WASM 可以用来检查 JS 方法的完整性吗?

python - GDB+Python : Determining target type

c++ - gdb和ffmpeg编译

math - 使用位移位除以 10?

c++ - 如何在 PC/Visual C++ 上查明指针是否在堆栈上

C:元素个数奇数的数组归并排序

c - long long数组在c中调用索引0时未返回期望值

shell - gdbserver:执行目标的shell命令

embedded - 树莓派上的 ARM 时钟速度