2012-09-12 33 views
2

我使用valgrind來驗證我的代碼,並在我的一個函數中報告「條件跳轉或移動取決於未初始化的值」,它將一個指針數組作爲參數。如何在運行時檢查指針變量是否爲垃圾?

現在,如何在運行時檢查數組是否包含垃圾值(可能使用條件斷點)?說,我不訪問指針,因此程序不會中斷。

要檢查識別垃圾指針的條件是什麼?

+3

除非指針爲NULL,否則無法判斷指針是否爲「垃圾」。 – dasblinkenlight

+1

@dasblinkenlight增加:沒有合法的方式,往往沒有簡單實用的方法。 –

回答

1

你不測試的垃圾,你把非垃圾值的數組在創建數組的時間之間的某一點,你認爲第一次使用的值。通常你這樣做是創建數組的時候:

const char* strings[] = {0, "junk", "here"}; 
int some_values[10] = { 0 }; 

Valgrind的使用自己的技巧,以確定它認爲是垃圾,但這些招數都是標準的範圍之內,常規的C代碼不能使用它們(或者反正不應該嘗試)。即使你能夠以某種方式掛鉤valgrind的功能,你最終會得到的代碼不適用於所有的實現,或者只能在valgrind下運行時才能使用。

2

不能區分一個有效的指針和垃圾(未初始化的)指針,它們都只是數字。

事實上,您正在處理代碼中某處的「垃圾」指針,表明在達到該點之前存在問題。

1

您需要將所有指針系統地初始化爲NULL。 當您釋放內存時,也將您的指針重置爲NULL。 這可以使用「構造函數/析構函數」函數包裝malloc/free來完成。 只有這樣你才能測試NULL值指針,看看是否出現了問題。

+0

還沒有。例如'char * a = calloc(1,1); char * b = a;免費的(a); a = 0;如果(b)printf(「%d \ n」,* b);'。在釋放後,我將'a'設置爲空指針,就像規則說的那樣,並且在使用它之前我檢查了'b',就像規則說的那樣。但是這對我沒有好處,我仍然有不確定的行爲。 C中沒有替代品用於設計,記錄和尊重對象的生命週期。 –

+0

好點....這就是爲什麼我喜歡這樣,學習一些東西的好地方,並把你的knwoledge在測試:) –

+0

+1爲解決[避免晃來晃去的指針](http://en.wikipedia.org/維基/ Dangling_pointer#Avoiding_dangling_pointer_errors)。 @Steve正確地說,這不會檢查指針副本,但我仍然使用這個概念,因爲我認爲某種保護比零保護更好。 –

2

而其他的答案是正確的,你還可以得到的valgrind幫你找出究竟是導致問題的陣列,其中一個或多個條目。

你需要做的是將代碼添加到您的程序,循環陣列上(可能已經有當然的這樣一個循環),然後包括valgrind/memcheck.h像這樣添加一些循環:

if (VALGRIND_CHECK_VALUE_IS_DEFINED(entry)) { 
    printf("index %d undefined\n", index); 
} 

其中entry是從陣列的實際值和index處於ARRY該值的索引。