簡體   English   中英

是否可以在C / C ++中定義/加擾不確定值以進行調試?

[英]Is it possible to define/scramble indeterminate values in C/C++ for debug purposes?

未初始化的變量可能有不確定的值, 這個回答前面一個問題指出。 有沒有辦法將這個不確定的數據指定為重復0xDEADDEAD 不確定的數據顯然是特定於編譯器的,但強迫它成為易於識別的東西總是很好的。

現有的內存泄漏/損壞檢測庫是否允許這樣做? 在某些情況下,重載new似乎是一種解決方案,但我寧願不自己深入研究這種技巧。

問題是不確定的值通常會導致代碼的未定義行為,並且很少出現運行時錯誤,因此,例如,我想知道我是否忘記了代碼中某處的memset() 甚至可能隨機化不確定值也可以作為測試平台。

如果無法做到這一點,是否有更好的方法來解決問題?

以下是生成高質量C代碼的一些指導原則:

  1. 創建/使用編碼指南,以幫助避免內存錯誤(和其他類型的錯誤)。 互聯網上有很多例子。 最好的方法是看看5或6並將其編譯成一個,只保留適合需求的東西。
  2. 使用代碼審查/檢查來查找錯誤並檢查是否遵守編碼指南。 代碼審查是查找工具無法檢測到的錯誤的最佳方法之一。 代碼評審對於初學者/中間程序員來說非常重要,因為它會增加您的學習曲線,無論是在您查看其他人編寫的代碼還是在您進行審核時。
  3. 使用可以自動運行的測試用例測試代碼。
  4. 使用像valgrind這樣的工具來查找許多類型的錯誤。

在運行時檢查變量值的模式有點棘手。 如你所說,它依賴於編譯器/體系結構。

通常,靜態分析工具可以為您提供有關未初始化變量的警告。 這是一個免費的靜態代碼檢查器,您可以使用: 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.

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