C 如何修改返回值?

C 如何修改返回值?,c,gdb,low-level,gsoap,C,Gdb,Low Level,Gsoap,我有一个例程调用gSoapAPI函数soap\u malloc。但是每当我试图访问soap\u malloc分配的内存时,程序就会给我一个分段错误。当我使用gdb调试它时。我发现在soap\u malloc中,存储在寄存器%rax中的返回值是0x7fffec0018f0。但返回时,%rax更改为0xffffffffec0018f0。仅保留较低的32位,较高的32位全部更改为1。这导致访问一个相当高的地址,因此导致例程停止。谢谢你们所有人给我任何关于这怎么可能发生的想法。我正在Ubuntu12.0

我有一个例程调用
gSoap
API函数
soap\u malloc
。但是每当我试图访问soap\u malloc分配的内存时,程序就会给我一个
分段错误。当我使用
gdb
调试它时。我发现在
soap\u malloc
中,存储在寄存器
%rax
中的返回值是
0x7fffec0018f0
。但返回时,
%rax
更改为
0xffffffffec0018f0
。仅保留较低的32位,较高的32位全部更改为
1
。这导致访问一个相当高的地址,因此导致例程停止。谢谢你们所有人给我任何关于这怎么可能发生的想法。我正在Ubuntu12.04 x86-64中运行我的多线程程序

我这样称呼它:

void *temp = soap_malloc(soap, 96);
这就是
soap\u malloc
实现(只执行
else
部分,宏
soap\u malloc
只是将第二个参数传递给
malloc
soap\u CANARY
是常量
0xC0DE
):

这是
SOAP\u NON\u NULL
的定义:

static const char soap_padding[4] = "\0\0\0";
#define SOAP_NON_NULL (soap_padding)
更新(2013-03-12)

我明确声明
soap\u malloc
返回
void*
,问题就解决了。以前,在将结果分配给
void*temp

时,返回值被截断为
int
,符号位
1
被扩展。调用代码是否在作用域中为
soap\u malloc()
函数提供了正确的原型


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

对不起,我应该把调用代码放在
soap\u malloc
上面。我只是用了一个
void*temp
来存储返回值。@leowang不确定我是否理解您的更正。。。那没关系。如果调用普通的old
malloc()
而不包括如下标题:
void*p=malloc(1024)
,则会得到一个
int
大小的结果。
=
左侧的类型无关紧要。很抱歉,我不明白。malloc有什么问题吗?标题
是什么意思?忘了提一下,即使我使用结构指针来强制转换
soap\u malloc的返回值,更高的32位仍然更改为
1
leowang所说的是,您需要为函数malloc定义一个extern声明,就像在stdlib.h头文件中一样:extern void*malloc(size_t);。如果您在某个地方没有这一点,那么编译可能会假定extern int malloc()这将导致您的代码假设返回的是整数而不是空指针,这可能是导致截断的原因。您能否提供一个再现此问题的最小代码示例?在某些地方,您使用soap\u malloc,在其他地方,您使用soap\u malloc。SOAP\u MALLOC的定义是什么,或者它是gSoap库的一部分?@Jere I description
SOAP\u MALLOC
是一个宏,它只是将第二个参数传递给
MALLOC
。很抱歉,我会将它们编辑到代码体中。@MichaelFoukarakis您认为还有哪些地方会导致此问题?我的意思是,我使用
void*
变量存储soap\u malloc
返回的值,它也是
void*
类型<代码>%rax
保持
0x7fffec0018f0
直到
soap\u malloc
返回。@Jere是的,它是gSoap库的一部分。
static const char soap_padding[4] = "\0\0\0";
#define SOAP_NON_NULL (soap_padding)