这个函数隐藏在一个复杂的嵌套中,所以实际上找到原因可能超出我能提出的任何要求,但我想知道是否有人可以提供一些关于我如何调试它的提示。 这是我遇到问题的代码的要点
//func1.c
somestruct* func1(somestruct* mystruct)
{
printf("func1: %p, %i\n", mystruct, mystruct->foo);
return mystruct;
}
//func2.c
somestruct* func1(somestruct* mystruct);
void func2()
{
somestruct *mystruct = malloc(sizeof(somestruct));
mystruct->foo = 10;
printf("func2: %p, %i\n", mystruct, mystruct->foo);
mystruct = func1(mystruct);
printf("back in func2: %p\n", mystruct);
free(mystruct);
}
我叫func2。输出就像这样
func2: 0x7f38a00008c0, 10
func1: 0x7f38a00008c0, 10
back in func2: 0xffffffffa00008c0
(SEGFAULT trying to free 0xffffffffa00008c0)
实际的代码更复杂,“mystruct”在许多其他地方传递也没有问题,函数在不同的文件中的事实似乎可能是问题的一部分,是的它需要返回指针(返回的指针不保证与输入指针相同)。 这对我来说似乎很奇怪,它有点(但实际上并没有)被截断为32位,然后在顶部填充ffffffff。
在32位机器上编译时,它的工作原理完全正确。
我在某个地方考虑过内存损坏,所以我通过valgrind运行它。 Valgrind报告没有错误,实际上导致它成功完成。教科书heisenbug。至少我可以使用GDB。
有没有人知道可能导致这种情况的原因,或者至少我可能会如何开始追踪问题?
答案 0 :(得分:13)
检查你的代码,如果你错过了函数原型(somestruct * func1(somestruct * mystruct);)。在func2.c中。
默认情况下,所有返回值都是int。因此,如果函数缺少原型,则编译器将返回值视为32位,并生成32位返回值的代码。那就是当你的高4字节被截断时。