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

Abh*_*bhi 0 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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,c_var2有时会被重新启动.

我们确信它是重新启动的,因为我们还打印了每个变量的内存位置,并且它永远不会改变.我们怀疑s_var1可能会覆盖c_var2,但这两个变量的内存位置相距很远.

Emp*_*ian 5

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

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

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

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

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

如果我在某处添加延迟,则为intance

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

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