繁体   English   中英

指针值可以通过将它传递给另一个函数来改变吗?

[英]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 个可能的原因(最有可能到最不可能):

  1. 在范围变化之后,您的程序具有未定义的堆栈使用行为。
    也就是说,如果key->s->fds[3].handler指向已经返回的帧的堆栈,则该堆栈将被后续调用指令覆盖。
  2. 你没有step远远不够。
    如果被调用的函数被优化了,GDB 有可能在hello_read_init prolog(寄存器尚未设置的区域)停止。
  3. 您有一个多线程程序和数据竞争(另一个线程在第一个线程使用它时覆盖key->s->fds[3].handler->handle_read )。

使用 Address Sanitizer 应该立即显示这是否是 UB 的实例(上面的第一种可能性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM