2014-07-07 32 views
5

我還沒弄清楚是什麼導致它,但我想知道是否有任何錯誤(警告?)消息的後果「嘗試釋放未引用標量:在全局破壞期間SV 0x825b790」。對於未經訓練的人來說,似乎由於編譯器很難檢測到問題,所以它不會繼續並重新刪除未引用的內存。可以安全地忽略「嘗試釋放未引用的標量」錯誤嗎?

這只是告訴我,我的編程是sl??還是存在我應該關注的實際問題?

背景:這不是我的代碼,我真的沒有時間去追捕這個問題,而且我應該注意到它發生在程序結束時。

+0

不,根本沒有。這是一個非常嚴重的問題。這意味着不應讀取或更改的內存正在被讀取或更改。 – ikegami

回答

8

這是XS模塊或Perl本身的錯誤。這意味着有一個請求釋放已經釋放的標量。

這表明某些代碼持有它認爲有效的指針,但不是。這可能會導致代碼寫入到內存的代碼不應該被修改,這可能會導致數據完整性問題,內存設計缺陷等

有人檢測在程序退出的時候,但發生問題可能會發生隨時。從釋放到錯誤發佈時,您會遇到問題。

例如,

use Inline C => <<'__EOI__'; 

void buggy(SV* sv) { 
    SvREFCNT_dec(sv); 
} 

__EOI__ 

my $x; 
buggy($x); 
# $x is no longer allocated here, but I could still try to use it. 

輸出:

Attempt to free unreferenced scalar: SV 0xc43fc0, Perl interpreter: 0xc22690. 
+0

有沒有內聯C代碼發生錯誤的情況? –

+1

@ Mr.Llama只有當perl本身存在一個bug時,纔會發生,但不太可能。而內聯並不是使用C代碼的唯一方式,XS更常見且不太明顯。 – AKHolland

+0

這可能是類似的情況? :http://stackoverflow.com/questions/32611173/git-push-failed-updating-remote-server-info?noredirect=1#comment53073660_32611173 –

相關問題