2014-10-20 49 views
1

我收到了遺留代碼(c),它似乎在不同的時間產生不同的結果。 我能夠一直使用intel的編譯器和編譯器標誌-ftrapuv重現這個問題,這個工作非常好,我能夠確定未初始化的變量是一些堆棧變量。 問題是,下一個階段是什麼? 有誰知道如何打印所有堆棧變量的回溯? (或者直接打印堆棧內容) 有沒有人有建議或知道英特爾可能如何提供幫助?或者我應該繼續解決這個問題?如何找到未初始化的堆棧變量

謝謝。

+8

嘗試Valgrind的,它發現未初始化變量的讀取和打印堆棧跟蹤。 – 2014-10-20 15:21:32

+7

您可以使用即將推出的CLang和GCC版本中的新改進UBSanitizer! – rodrigo 2014-10-20 15:21:39

+0

編譯時打開所有警告。或者使用任何一種靜態分析儀。 (我不會提到我曾經工作過的那個,但它是非常昂貴和最好的。找到一個更便宜的免費的:這個錯誤並不難找到。) – 2014-10-20 15:35:03

回答

2

使用-ftrapuv或Valgrind的memcheck可以在註釋中使用,但這些是動態分析,只會捕獲在運行時執行的錯誤;如果您的測試執行不執行錯誤代碼,這些工具將不會有幫助。

幸運的是,使用未初始化的堆棧變量通常可以通過靜態方式輕鬆檢測到,並且您的編譯器有可以幫助您理解的標誌。海灣合作委員會和英特爾icc都支持-Wuninitialized標誌,該標誌將打印關於違規代碼的警告。 gcc還支持一個-Wmaybe-uninitialized標誌,當有某些代碼路徑時,它會發出警告,其中變量可能在其上未初始化;請注意,後面的分析容易出現誤報。