2012-02-20 108 views
0

我有這個循環,它解析機器代碼並仿真指令,就好像它是一個處理器。如果在任何時候我嘗試訪問超出程序定義的內存位置(1MB)的內存大小,它將打印一個錯誤,說我超出範圍。在此循環中插入fprintf()將導致其無限循環。爲什麼?

這是學校裏的功課,所以所有輸入的二進制文件應該可以正常工作,如果我的代碼是正確的。但是在其中一個二進制文件中,我有一個錯誤,指出我試圖訪問超出此範圍的內存。所以我想在那裏放一個fprintf()(或者只是printf(),沒關係)聲明,看看我的一些變量的內容。但是,當我這樣做時,我會得到完全不同的行爲。我從來沒有得到這個消息,而是程序無限循環。我沒有改變別的。而且它看起來與我打印的內容無關。插入printf("hello")會導致相同的行爲。

如果我把我的fprintf(),打印錯誤的函數裏面,我沒有得到無限循環,一切都打印爲我所期望的。

這是一個相當龐大而複雜的程序,所以我不能只將其粘貼在這裏,我不認爲只是一小部分就足夠了,所以我希望我提供足夠的信息來獲得幫助。

我在我的陳述結尾處添加換行符,因爲我讀過應該刷新緩衝區,但即使我添加了fflush(stdout),它似乎也沒有關係。

+1

聽起來像你可能有內存損壞錯誤,緩衝區溢出或甚至堆棧崩潰。不幸的是,這些很少出現故障的地方,但後來當別的東西使用記憶時可能很難找到。 – Dampsquid 2012-02-20 01:38:04

回答

1

有了您所能提供的信息,聽起來您的程序正在參展未定義的行爲。未定義的行爲並不一定意味着程序會崩潰,它可能看起來工作正常。直到你改變別的東西,比如在某處添加fprintf(),那麼它可能會失敗。

你可能想嘗試Valgrind下運行您的程序,以幫助捕捉內存相關的錯誤。此外,請在編譯器上調整警告級別並修復它找到的所有內容。

靜態分析儀,如CppcheckClang Static Analyzer也有幫助。

+0

看起來這是正確的答案。我仍然不知道爲什麼打印某些東西導致無限循環,但是我發現在跳轉和鏈接指令中,我錯誤地計算了函數返回地址,因此每次從函數調用返回時都跳過一條指令。所以我一定是在某處破壞了記憶。我懷疑'* printf()'函數最終使用了一些我很高興覆蓋的內存,然後跳過每個函數返回的指令,導致我錯過了一個循環計數器增量器。 – 2012-02-20 02:51:41

相關問題