AI News HubLIVE
站內改寫1 分鐘閱讀

我們不能100%信任AI生成的結果:一個具體例子

作者在使用Claude審查其WinReg C++庫程式碼時,Claude報告了字串獲取方法中存在零長度崩潰的bug。但經過檢查,該bug並不存在,因為程式碼正確使用了`dataSize / sizeof(wchar_t) - 1`來調整大小,而Claude誤以為未處理dataSize == 0的情況。

來源Hacker News AI作者: movd128

近日,開發者Giovanni Dicanio在部落格中分享了一個關於AI程式碼審查的警示案例。他使用Anthropic的Claude模型審查其WinReg C++庫(一個對Windows登錄檔API進行高階封裝的C++庫)的程式碼時,Claude報告了多個嚴重bug:聲稱在RegKey類的GetStringValue、GetExpandStringValue、TryGetStringValue和TryGetExpandStringValue方法中,如果遇到零長度的REG_SZ或REG_EXPAND_SZ值,會導致程式崩潰。

然而,當作者親自檢查程式碼後,發現這個所謂的bug並不存在。Claude指出作者在二進位制獲取方法(如RegKey::GetBinaryValue)中確實正確處理了dataSize == 0的情況,但字串獲取方法缺少保護。實際上,字串獲取方法統一使用了以下程式碼:

result.resize((dataSize / sizeof(wchar_t)) - 1);

當dataSize為0時,該公式計算結果為-1,而resize()函式在傳入-1時實際上會引發異常(或按實現定義行為),但作者指出,在Windows登錄檔中,零長度的REG_SZ或REG_EXPAND_SZ值實際上不會出現,因為登錄檔API對於空字串會返回2位元組(包括終止符),因此dataSize至少為2,從而避免了問題。此外,如果dataSize為0,正確的做法是單獨處理空字串,但現實場景中幾乎不存在這種情況。

Dicanio強調,這個例子並非要貶低AI工具的價值,而是提醒開發者在利用AI輔助時必須保持警惕。盲目接受AI的建議可能導致引入不必要的修復,甚至誤解程式碼行為。他建議開發者在使用AI審查結果時,應結合具體上下文和實際平臺特性進行驗證。

該案例在技術社群引發討論,許多開發者分享了類似經歷,認為AI在程式碼審查中容易產生“幻覺”,尤其是在處理低層系統API或特定平臺約定時。專家建議,AI工具更適合作為輔助參考,最終決策仍需人工判斷。