[英]Can a pointer value change just by passing it to another function?
我正在使用 GDB 调试我的函数 A,就在调用函数 B 之前,我打印了以下值:
p *(key->s->fds[3].handler)
结果我得到了:(这些都是函数指针)
$3 = {handle_read = 0x55555555ba49 <socks5_read>, handle_write = 0x55555555baa2 <socks5_write>, handle_block = 0x55555555bb0a <socks5_block>, handle_close = 0x55555555bb15 <socks5_close>}
然后,我输入s
以使用 GDB 进入函数 B。 紧接着,我再次打印p *(key->s->fds[3].handler)
,但它的值是:
$4 = {handle_read = 0x7fffffffdb90, handle_write = 0x5555baa2, handle_block = 0x55555555bb0a <socks5_block>, handle_close = 0x55555555bb15 <socks5_close>}
我知道这个问题真的很开放,因为我应该展示我的一些代码。 但我的问题很笼统:是否有可能仅通过将指针传递给函数来更改结构的内容?
如果有帮助,这是我在 GDB 中所做的完整跟踪:
(gdb) s
31 stm->current->on_arrival(stm->current->state, key);
(gdb) p *(key->s->fds[3].handler)
$3 = {handle_read = 0x55555555ba49 <socks5_read>, handle_write = 0x55555555baa2 <socks5_write>, handle_block = 0x55555555bb0a <socks5_block>,
handle_close = 0x55555555bb15 <socks5_close>}
(gdb) s
hello_read_init (state=0, key=0x7fffffffdb90) at src/stm/stm_hello.c:20
20 hello_stm *hello_stm = &ATTACHMENT(key)->hello_state;
(gdb) p *(key->s->fds[3].handler)
$4 = {handle_read = 0x7fffffffdb90, handle_write = 0x5555baa2, handle_block = 0x55555555bb0a <socks5_block>,
handle_close = 0x55555555bb15 <socks5_close>}
是否有可能仅通过将指针传递给函数来更改结构的内容?
我能想到 3 个可能的原因(最有可能到最不可能):
key->s->fds[3].handler
指向已经返回的帧的堆栈,则该堆栈将被后续调用指令覆盖。step
远远不够。hello_read_init
prolog(寄存器尚未设置的区域)停止。key->s->fds[3].handler->handle_read
)。使用 Address Sanitizer 应该立即显示这是否是 UB 的实例(上面的第一种可能性)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.