gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:38 25 4
gpt4 key购买 nike

我们有一个包含 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,但这两个变量的内存位置相距甚远。

最佳答案

We suspected s_var1 might overwrite the c_var2 but the memory locations of these 2 variables are far apart.

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

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

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

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

For intance if i add delay somewhere

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

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

关于c - linux下gcc中的静态变量重新初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com