【问题标题】:Static variable reinitialization in gcc under linuxlinux下gcc中的静态变量重新初始化
【发布时间】:2012-05-17 04:00:39
【问题描述】:

我们有一个带有 3 个静态变量的函数。这很奇怪,但我们有时会看到 3 个静态变量之一正在重新初始化:

static uchar * Foo( uchar c_par1, uchar c_par2, uchar c_par3 )
{
   static char        s_var1[10];
   static uchar       c_var2     = 0;
   static uchar       c_var3     = 0;
   .....
   return s_var1;
}

在上述情况下,c_var2 有时会重新初始化。

我们确信它已重新初始化,因为我们还打印了每个变量的内存位置,并且它永远不会改变。我们怀疑 s_var1 可能会覆盖 c_var2 但这两个变量的内存位置相距甚远。

【问题讨论】:

  • @AlexLockwood 这个问题很容易看出:“这怎么可能发生?”
  • valgrind --leak-check=full 说什么?answer>
  • @smocking Valgrind 不检测全局(或堆栈)溢出,因此极不可能说出任何有用的信息。而--leak-check 与该问题完全无关。所以恐怕你的罐头答案不是很有用。

标签: c linux gcc


【解决方案1】:

我们怀疑 s_var1 可能会覆盖 c_var2 但这两个变量的内存位置相距甚远。

这听起来像是某处的全局缓冲区溢出。

运行nm -n a.out,找出接近c_var2的变量。然后寻找由这些变量引起的溢出。

或者使用Address Sanitizer,它应该可以很容易地为您提供错误的确切位置。

另一种调试方法:在 GDB 下运行程序,并在c_var2 地址上设置观察点。每次修改 c_var2 时都应触发观察点。

例如,如果我在某处添加延迟

如果您的程序是多线程的,请注意静态变量和线程不能很好地协同工作。

如果它不是多线程的,我看不出延迟会产生什么影响(除非你也在处理信号)。

【讨论】:

  • 好吧,我们尝试找到原因,但无法完全找到。编译很重要:例如,如果我在某处添加延迟,或者如果我在该变量之前添加一些变量,则此变量 c_var2 现在可以正常工作而没有任何问题。所以很明显,这在其他地方是个问题。谢谢大家的支持。
猜你喜欢
  • 2018-08-13
  • 2011-08-22
  • 2010-12-22
  • 2017-12-07
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多