Linux下C程序函数局部变量地址被第三方函数更改,可能原因是什么?

问题描述

问题非常奇怪,函数中定义了局部变量,在调用完第三方函数后(未使用此局部变量传参或指针),局部变量的值被置为0了。
gdb调试和打印日志发现,局部变量的地址被更改了!!!求大神指导。

问题出现的环境背景及自己尝试过哪些方法

gdb调试和打印日志,都可以发现是调用第三方函数后出现了这个问题。具体可以参考下面示例,实际函数内部很多个局部变量地址都被改变了,怀疑是某一块存储区域被改变了。

  1. 变量改为static后,可以解决问题,变量地址前后没有变化,值不变(不符合函数需求,实际没法这么干);
  2. 删除调用第三方函数代码,可以解决问题,变量地址前后没有变化,值不变;
  • 操作系统:RedHat 7.4 x86_64
  • gcc版本: 4.8.5 20150623

相关代码

业务代码比较复杂,以下是示意代码:

void f1()
{
    short nTestId = 7;

    打印变量地址和值:
    printf("before: [%p][%d]", &nTestId, nTestId);
    // 调用第三方函数
    f2();
    printf("after: [%p][%d]", &nTestId, nTestId);
}

某次运行的结果:

before: [0x7ffd522328ca][7]
after: [0x7ffd5223287a][0]

疑问

C程序中,有可能在应用层更改局部变量的地址吗?我理解程序启动时变量地址已经确定了,不可能再改变了吧。
上述问题可能是什么原因造成的?

阅读 2.6k
1 个回答

内存越界,把堆栈写坏了。调用后栈顶指针变了。

局部变量地址不变的是相对于栈顶的偏移。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题