我在测试一个示例代码时遇到了一些问题,因为我的 abs 函数没有返回正确的结果。abs(-2) 正在输出 -2 (顺便说一下,这应该是绝对值函数,如果不清楚的话)
在变得有点绝望之后,我最终得到了以下代码
#include <stdio.h>
unsigned int abs(int x) {
return 1;
}
int main() {
printf("%d\n", abs(-2));
return 0;
}
这没有任何用处,但它可以显示我的问题。这是输出 -2,而预期输出 1。
如果我将函数名称更改为其他名称(例如 abs2),则结果现在是正确的。此外,如果我将其更改为接收两个参数而不是一个,它也可以解决问题。
我的明显猜测:与标准 abs 函数冲突。但这仍然不能解释为什么输出是 -2(如果使用标准 abs 函数,它应该是 2)。我尝试检查两个版本的汇编输出(使用名为 abs 和 abs2 的函数)
这是两个程序集的差异输出:
23,25c23,25
< .globl abs
< .type abs, @function
< abs:
---
> .globl abs2
> .type abs2, @function
> abs2:
54c54
< .size abs, .-abs
---
> .size abs2, .-abs2
71c71,74
< movl -4(%rbp), %edx
---
> movl -4(%rbp), %eax
> movl %eax, %edi
> call abs2
> movl %eax, %edx
据我了解,第一个版本(函数名为 abs)只是丢弃函数调用,因此使用参数 x 而不是 abs(x)
总结一下:为什么会发生这种情况,特别是因为我找不到一种方法来获得任何关于此的警告或错误。
在 Debian Squeeze、ggc 4.4.5 和 gcc 4.1.2 上测试