首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针值可以通过将指针传递给另一个函数来改变吗?

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

Stack Overflow用户
提问于 2020-11-02 14:25:00
回答 2查看 165关注 0票数 2

我正在用GDB调试我的函数A,在调用函数B之前,我打印了以下值:

代码语言:javascript
复制
p *(key->s->fds[3].handler)

结果是:(这些都是函数指针)

代码语言:javascript
复制
$3 = {handle_read = 0x55555555ba49 <socks5_read>, handle_write = 0x55555555baa2 <socks5_write>, handle_block = 0x55555555bb0a <socks5_block>, handle_close = 0x55555555bb15 <socks5_close>}

然后,我输入s输入函数B与GDB。紧接着,我再次打印p *(key->s->fds[3].handler),但是它的值是:

代码语言:javascript
复制
$4 = {handle_read = 0x7fffffffdb90, handle_write = 0x5555baa2, handle_block = 0x55555555bb0a <socks5_block>, handle_close = 0x55555555bb15 <socks5_close>}

我知道这个问题是公开的,因为我应该展示我的一些代码。但我的问题是一般性的:我的结构的内容是否有可能仅仅通过传递指向函数的指针而改变呢?

如果有帮助,这就是我在GDB中所做工作的完整跟踪:

代码语言:javascript
复制
(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>}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-02 15:10:47

是否可能仅仅通过传递指向函数的指针就可以更改结构的内容?

我可以想到三个可能的原因(大部分是最不可能的):

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

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

票数 0
EN

Stack Overflow用户

发布于 2022-10-26 14:48:45

除了@Employed俄罗斯语的答案之外,如果您已踏入具有不同预编译器定义的库中的文件,并且在要在GDB中打印的数据中有"#ifdef XXX“字段,则会发生这种情况。我刚遇到这个案子。

例如,假设名为"test_cmd“的二进制文件有-DDEBUG,但是名为"lib_my_cmd”的库没有它。然后你的结构被定义为..。

代码语言:javascript
复制
// my_cmd.h has...
typedef struct {
    #ifdef DEBUG
      int my_debug_only_field;
    #endif
    int my_regular_field;
} my_info;
...
代码语言:javascript
复制
// my_cmd.c, built as part of lib_my_cmd without -DDEBUG, has...
#include "my_cmd.h"

void do_foo(my_info* inputs) {
    // GDB stepping in here, where DEBUG is not defined, the value of
    //   inputs.my_regular_field is 1.  <== Expected to be 0!!!
}
代码语言:javascript
复制
// my_foo_test.cc, built in the binary with -DDEBUG, has...
#include "my_cmd.h"

void test_foo() {
    my_info inputs;
    inputs.my_debug_only_field = 1;
    inputs.my_regular_field = 0;
    do_foo(&inputs);
    //...

当您从inputs进入do_foo(...)时,test_foo()字段值会发生变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64647379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档