我是在我的fedora13 x86_64上面调试的到的结果,以_slist_insert_n为例:
其中有一段代码是:
va_start(val_elemlist, t_count);
...
for(...; ...; ...)
{
_slist_push_front_varg(pt_list, val_elemlist);
}
...
va_end(val_elemlist);
在_slist_push_front_varg(pt_list, val_elemlist)中多次使用了val_elemlist,在我的机器上val_elemlist是一个结构的指针:
val_elemlist = {gp_offset = 32, fp_offset = 48, overflow_arg_area = 0x7fff93b6bd10, reg_arg_area = 0x7fff93b6bc10}
参数保存在reg_arg_area指向的地址中,gp_offset的偏移量:
0x7fff93b6bc10: 0x93b6bc80 0x00007fff 0x00008000 0x00000000
0x7fff93b6bc20: 0x93b6def0 0x00007fff 0x00000003 0x00000002
0x7fff93b6bc30: 0x9ee63e10 0x00007fa0 0x0000000a 0x00000000
0x7fff93b6bc40: 0x00000000 0x00000000 0x01e96810 0x00000000
最开始gp_offset = 16,第一次取出的参数是有效的(蓝色字体),然后gp_offset = 24了,当第二次再取参数的时候就是无效的了,这样使用第二次取出的参数再进行计算就出现了错误。
32位系统上没有出现问题是由于va_list的实现不同,多次取参数不会导致偏移量改变,或者是根本就没有偏移量。
阅读(6447) | 评论(0) | 转发(0) |