如何解决指针值可以仅通过传递给另一个函数来更改吗?
我正在使用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个可能的原因(最有可能):
- 您的程序具有stack use after scope种类的不确定行为。
也就是说,如果key->s->fds[3].handler
指向已经返回的帧的堆栈,则该堆栈将被后续的调用指令覆盖。 - 您距离
step
不够远。
如果对调用的函数进行了优化,则GDB可能会在hello_read_init
序言(尚未设置寄存器的区域)中停止。 - 您有一个多线程程序和一个数据竞争(另一个线程在第一个线程使用
key->s->fds[3].handler->handle_read
时覆盖了#pragma pack
)。
使用Address Sanitizer应该立即显示这是否是UB的实例(上面的第一种可能性)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。