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工具更適合作為輔助參考,最終決策仍需人工判斷。