-D_FILE_OFFSET_BITS=64 的BUG有人遇到没

祥和平静 2013-01-04 05:28:42
加精
bug_ex.c

#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <stdio.h>

void bug2(void *a,void *b,uint64_t offset,uint64_t size,void *fp,int ver)
{
printf("fp:%p\n",fp);
}

bug.c

#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <stdio.h>

void bug1(void *a,void *b,uint64_t offset,uint64_t size,void *fp,int ver)
{
printf("fp:%p\n",fp);
}
int main()
{
void *a = malloc(1);
void *b = malloc(1);
void *fp = malloc(1);
off_t offset = 1;
size_t size = 1;

bug1(a,b,offset,size,fp,1);
bug2(a,b,offset,size,fp,1);

free(a);
free(b);
free(fp);
return 0;
}

Makefile

all:bug bug.asm
bug.asm:bug
objdump -SD bug >bug.asm
bug:bug.o bug_ex.o
gcc -g -o bug bug.o bug_ex.o
bug.o:bug.c
gcc -g -D_FILE_OFFSET_BITS=64 -c bug.c
bug_ex.o:bug_ex.c
gcc -g -D_FILE_OFFSET_BITS=64 -c bug_ex.c
clean:
rm -f bug.o bug_ex.o bug bug.asm



我在ubuntu11.10,gcc 4.6.1上make编译后执行后
./bug
fp:0x80ea028
fp:0x1
两个函数打印不同。
有人遇到过这种问题吗?
...全文
4259 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangeen 2013-01-14
  • 打赏
  • 举报
回复
居然一眼就看出了这么难查的bug
yujie_v 2013-01-14
  • 打赏
  • 举报
回复
围观bug,不太懂。。。
Arnold9009 2013-01-12
  • 打赏
  • 举报
回复
最好在编译的时候打开 -Werror选项
mymtom 2013-01-11
  • 打赏
  • 举报
回复
引用 20 楼 lichujing 的回复:
32位上size_t入栈时按32位来压,那出栈时就不是按32位来取的吗?为何出栈时又按64位去取呢?
这里描述的不是出栈的情况,而是在bug2函数取参数的情况,由于 void bug2(void *a,void *b,uint64_t offset,uint64_t size,void *fp,int ver) 里size是unit64_t类型,所以在bug2函数中是按64位取size参数的。 为了解决这种调用函数时参数不匹配的问题,是c99和C++都强制要求函数证明。
ldd 2013-01-10
  • 打赏
  • 举报
回复
版主大牛,细节知道的这么清楚 学习了
太阳出来落位 2013-01-10
  • 打赏
  • 举报
回复
分析得如何透彻,厉害
lichujing 2013-01-10
  • 打赏
  • 举报
回复
引用 5 楼 mymtom 的回复:
引用 2 楼 VermillionTear 的回复:引用 1 楼 mymtom 的回复:bug2函数在bug.c里没有声明就调用,这就是BUG。 确实如1楼所说,我在bug.c中加入了bug2()的声明,就不会出现地址不一致的现象。 能否请1楼解释一下原因何在?在make时不是已提供了bug2()的定义,为何还需要在bug.c中声明? 就楼主的例子说而言. b……
32位上size_t入栈时按32位来压,那出栈时就不是按32位来取的吗?为何出栈时又按64位去取呢?
微信公众号 2013-01-09
  • 打赏
  • 举报
回复
引用 5 楼 mymtom 的回复:
引用 2 楼 VermillionTear 的回复:引用 1 楼 mymtom 的回复:bug2函数在bug.c里没有声明就调用,这就是BUG。 确实如1楼所说,我在bug.c中加入了bug2()的声明,就不会出现地址不一致的现象。 能否请1楼解释一下原因何在?在make时不是已提供了bug2()的定义,为何还需要在bug.c中声明? 就楼主的例子说而言. b……
好厉害……学习了
lushenying 2013-01-09
  • 打赏
  • 举报
回复
支持!!支持!!Zc!!
  • 打赏
  • 举报
回复
引用 5 楼 mymtom 的回复:
引用 2 楼 VermillionTear 的回复:引用 1 楼 mymtom 的回复:bug2函数在bug.c里没有声明就调用,这就是BUG。 确实如1楼所说,我在bug.c中加入了bug2()的声明,就不会出现地址不一致的现象。 能否请1楼解释一下原因何在?在make时不是已提供了bug2()的定义,为何还需要在bug.c中声明? 就楼主的例子说而言. b……
学习了!!
边走边瞧 2013-01-09
  • 打赏
  • 举报
回复
这一点上C和C++相差蛮大的,如果是在C++里,会提示找不到函数bug2的编译错误。
kickxxx 2013-01-08
  • 打赏
  • 举报
回复
引用 11 楼 oyq_yangy 的回复:
难道没有warning。。。
很多人都不看warning的,看到别人提交的代码有warning,我蛋疼呀,每次都手贱的改掉
oyq_yangy 2013-01-08
  • 打赏
  • 举报
回复
难道没有warning。。。
chen1967 2013-01-08
  • 打赏
  • 举报
回复
,事情 部啼, 间
clever101 2013-01-08
  • 打赏
  • 举报
回复
学习,C语言真是博大精深啊!
mymtom 2013-01-05
  • 打赏
  • 举报
回复
引用 2 楼 VermillionTear 的回复:
引用 1 楼 mymtom 的回复:bug2函数在bug.c里没有声明就调用,这就是BUG。 确实如1楼所说,我在bug.c中加入了bug2()的声明,就不会出现地址不一致的现象。 能否请1楼解释一下原因何在?在make时不是已提供了bug2()的定义,为何还需要在bug.c中声明?
就楼主的例子说而言. bug.c调用函数bug2时,由于没有函数原型(也就是函数成名)编译器不知道函数的参数的具体类型,就按照实际参数的类型调用函数(也就是把参数入栈)也就是 a,b,offset,size,fp,1 类型为 void *, void *, off_t, size_t, FILE *, int 其中第4个实参的类型(size_t)与形参(int64_t)的类型不一致,在32为系统上 size_t是32位的,调用的时候按32位入栈(少了4字节),所以bug2里取参数fp的时候其实取到的是ver的值(1) 调用bug2时栈的状态

实际压栈情况 取参数情况
----------   ----------
|   a    |   |   a    | 栈顶
----------   ----------
|   b    |   |   b    |
----------   ----------
| offset |   | offset |
----------   ----------
| offset |   | offset |
----------   ----------
| size   |   | size   |
----------   ----------
| fp     |   | size   |
----------   ----------
| ver    |   | fp     |
----------   ----------
| xxxx   |   | ver    |
----------   ----------
VermillionTear 2013-01-05
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
bug2函数在bug.c里没有声明就调用,这就是BUG。
确实如1楼所说,我在bug.c中加入了bug2()的声明,就不会出现地址不一致的现象。 能否请1楼解释一下原因何在?在make时不是已提供了bug2()的定义,为何还需要在bug.c中声明?
mymtom 2013-01-05
  • 打赏
  • 举报
回复
bug2函数在bug.c里没有声明就调用,这就是BUG。
VermillionTear 2013-01-05
  • 打赏
  • 举报
回复
引用 5 楼 mymtom 的回复:
引用 2 楼 VermillionTear 的回复:引用 1 楼 mymtom 的回复:bug2函数在bug.c里没有声明就调用,这就是BUG。 确实如1楼所说,我在bug.c中加入了bug2()的声明,就不会出现地址不一致的现象。 能否请1楼解释一下原因何在?在make时不是已提供了bug2()的定义,为何还需要在bug.c中声明? 就楼主的例子说而言. b……
明白了,这种细节的地方理解得如此透彻,佩服!非常感谢您的解答!
fdl19881 2013-01-05
  • 打赏
  • 举报
回复
引用 5 楼 mymtom 的回复:
引用 2 楼 VermillionTear 的回复:引用 1 楼 mymtom 的回复:bug2函数在bug.c里没有声明就调用,这就是BUG。 确实如1楼所说,我在bug.c中加入了bug2()的声明,就不会出现地址不一致的现象。 能否请1楼解释一下原因何在?在make时不是已提供了bug2()的定义,为何还需要在bug.c中声明? 就楼主的例子说而言. b……
犀利,,学习下。

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧