ysyx:測試永遠不夠

namezhyp發表於2024-07-30

  儘管指令匹配的部分早就已經完成,但這並不代表程式碼方面就不會再檢測出漏洞。cpu-test這個測試集資料夾裡面的測試程式碼只是覆蓋了一部分內容,即使是全部透過,你的程式碼也仍有可能是錯誤的。

  當我在處理其他內容時,突然間nemu就卡在了程式碼某處提示地址錯誤。重新開啟difftest,定位到某處jal跳轉發生問題,PC暫存器的參考值和實際值不對應。此時問題就來了:難道是我的指令寫的有問題?但是這些都是檢驗過的指令,為什麼會報錯?

  多次檢查之後才發現,原來是補充的J型立即數的符號擴充宏一處程式碼寫錯了。本來是BITS(30,21),失誤寫成了BITS(31,21)。 就是這一處錯誤,導致nemu遇到這條特殊的jal指令時不能正確擴充立即數,導致最終跳轉地址計算錯誤。而在之前的指令測試環節,測試集裡所有的jal指令都很巧的在這個bit上沒有出現立即數擴充問題,導致這個問題被掩蓋了起來,直到今天才發現並修補。所以,隨時做好自己以前寫過的程式碼會被測試環節發掘出新問題的準備。此外,我們也可以意識到,對待一個大工程,測試真的是一個十分重要的環節。比如用來快速定位暫存器問題的difftest,在測試方面做好基礎工程真的能省下大量debug時間,節省很多功夫。包括itrace mtrace ftrace dtrace等,早點完成對後續開發有很大幫助。

相關文章