簡體   English   中英

Linux下gcc中的靜態變量重新初始化

[英]Static variable reinitialization in gcc under linux

我們有一個帶有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,但是這兩個變量的內存位置相距甚遠。

我們懷疑s_var1可能會覆蓋c_var2,但是這兩個變量的內存位置相距甚遠。

這聽起來像某個地方的全局緩沖區溢出。

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

或使用Address Sanitizer ,它應該能夠輕松為您提供確切的錯誤位置。

調試此錯誤的另一種方法:在GDB下運行程序,並在c_var2的地址上設置觀察點。 每次修改c_var2時, c_var2觸發監視點。

例如,如果我在某處添加延遲

如果您的程序是多線程的,請注意靜態變量和線程不能很好地協同工作。

如果它不是多線程的,那么我看不到延遲有什么影響(除非您也正在處理信號)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM