我们不能100%信任AI生成的结果:一个具体例子
作者在使用Claude审查其WinReg C++库代码时,Claude报告了字符串获取方法中存在零长度崩溃的bug。但经过检查,该bug并不存在,因为代码正确使用了`dataSize / sizeof(wchar_t) - 1`来调整大小,而Claude误以为未处理dataSize == 0的情况。
近日,开发者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工具更适合作为辅助参考,最终决策仍需人工判断。