[英]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.