[英]Is it possible to define/scramble indeterminate values in C/C++ for debug purposes?
未初始化的變量可能有不確定的值, 這個回答前面一個問題指出。 有沒有辦法將這個不確定的數據指定為重復0xDEADDEAD
? 不確定的數據顯然是特定於編譯器的,但強迫它成為易於識別的東西總是很好的。
現有的內存泄漏/損壞檢測庫是否允許這樣做? 在某些情況下,重載new
似乎是一種解決方案,但我寧願不自己深入研究這種技巧。
問題是不確定的值通常會導致代碼的未定義行為,並且很少出現運行時錯誤,因此,例如,我想知道我是否忘記了代碼中某處的memset()
。 甚至可能隨機化不確定值也可以作為測試平台。
如果無法做到這一點,是否有更好的方法來解決問題?
以下是生成高質量C代碼的一些指導原則:
在運行時檢查變量值的模式有點棘手。 如你所說,它依賴於編譯器/體系結構。
通常,靜態分析工具可以為您提供有關未初始化變量的警告。 這是一個免費的靜態代碼檢查器,您可以使用: cppcheck 。
存在不確定的值,存在內存管理錯誤,並且存在兩者的交集。
如果有任何C / C ++編譯器為不確定的值做了什么,我不知道是什么。 (我為一個可以說是類似於C的並行語言構建的編譯器有一個顯式的調試開關,它將每個未分配的變量填充一個設計為“引起麻煩”的值,例如,對於int,-2 ^ 31,用於指針,特定的not-void gauranteed值導致內存訪問錯誤等)。 我懷疑你的里程會因編譯器而有所不同。
內存管理非常困難。 在C ++中,您可以定期使用構造函數和析構函數來確保不會發生許多此類錯誤,請參閱stackoverflow.com/questions/76796/memory-management-in-c
C更難,仔細檢查您的代碼,並確保每個例程對分配,解除分配或兩者都沒有幫助。
對於C和C ++,您可以使用靜態分析工具(Coverity,Fortify)來檢測許多此類分配錯誤。 同樣,您可以使用動態分析工具,例如Valgrind,它可以監視目標代碼的作用,並在發生某些內存管理錯誤時停止它。 僅限C,您可以使用我們的動態分析CheckPointer工具; 它將檢測valgrind檢測到的所有錯誤以及更多(例如,valgrind無法檢測到本地數組之外的訪問[在堆棧中分配的一個]; CheckPointer可以)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.