微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针值可以仅通过传递给另一个函数来更改吗?

如何解决指针值可以仅通过传递给另一个函数来更改吗?

我正在使用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_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_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_close = 0x55555555bb15 <socks5_close>}

解决方法

仅通过将指针传递给函数,结构的内容是否有可能改变?

我可以想到3个可能的原因(最有可能):

  1. 您的程序具有stack use after scope种类的不确定行为。
    也就是说,如果key->s->fds[3].handler指向已经返回的帧的堆栈,则该堆栈将被后续的调用指令覆盖。
  2. 您距离step不够远。
    如果对调用的函数进行了优化,则GDB可能会在hello_read_init序言(尚未设置寄存器的区域)中停止。
  3. 您有一个多线程程序和一个数据竞争(另一个线程在第一个线程使用key->s->fds[3].handler->handle_read时覆盖了#pragma pack)。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。