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不确定我是否理解您的更正。。。那没关系。如果调用普通的oldmalloc()
而不包括如下标题: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 descriptionSOAP\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)