linux下gcc中的静态变量重新初始化

时间:2012-05-17 04:00:40

标签: c linux gcc

我们有一个带有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,但这两个变量的内存位置相差很远。

1 个答案:

答案 0 :(得分:5)

  

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

这听起来像某个地方的全局缓冲区溢出。

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

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

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

  

如果我在某处添加延迟

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

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