代码审查是保证质量的关键环节,但人眼总有疏漏。在十三Tech的实践中,我发现ChatGPT能帮我们发现那些隐藏在代码深处的隐患——从缺失的超时设置到不安全的哈希算法。
大家好,我是十三!
在用过ChatGPT辅助阅读源码后,我很好奇:它能不能帮我们审查代码质量?我挑选了三个自己以前写的真实代码片段——一个简单的HTTP请求、一个哈希计算函数、一段错误处理逻辑。这些代码表面上都没问题,但让ChatGPT审查后,它找出了不少值得改进的地方。
这篇文章,我将分享这三个真实案例,带你看看AI辅助代码审查的实际效果。
背景
最近 ChatGPT 大火,加上之前使用ChatGPT辅助阅读开源项目源码的体验很好,所以我尝试用ChatGPT来发现代码中的问题,提高代码质量。
操作一波
代码段一
下面是葫芦以前写极验sdk中的一段代码,功能很简单,就是一个http.Get请求
/**
* 发送GET请求,获取服务器返回结果
*/
func (g *GeeTestLib) httpGet(ctx context.Context, getURL string, params map[string]string) (string, error) {
q := url.Values{}
for key, val := range params {
q.Add(key, val)
}
req, err := http.NewRequest(http.MethodGet, getURL, nil)
if err != nil {
return "", errors.New("NewRequest fail")
}
req.URL.RawQuery = q.Encode()
res, err := g.Client.Do(ctx, req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
if res.StatusCode == 200 {
return string(body), nil
}
return "", nil
}
直接看下面其实是没什么问题的,下面上AI
这段代码没有显式地设置请求超时时间,可能会导致请求一直处于阻塞状态。可以在http.Client中设置超时时间来避免这种情况的发生。修改后的代码如下:
func (g *GeeTestLib) httpGet(ctx context.Context, getURL string, params map[string]string) (string, error) {
q := url.Values{}
for key, val := range params {
q.Add(key, val)
}
req, err := http.NewRequest(http.MethodGet, getURL, nil)
if err != nil {
return "", errors.New("NewRequest fail")
}
req.URL.RawQuery = q.Encode()
// 设置超时时间为5秒
timeout := time.Duration(5 * time.Second)
g.Client.Timeout = timeout
res, err := g.Client.Do(ctx, req)
if err != nil {
return "", err
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
if res.StatusCode == 200 {
return string(body), nil
}
return "", nil
}
是的了,chatgpt给我的代码提出需要增加超时时间的改进,默认设置为5s, 这个时间也是比较合理的,但葫芦仍不够满足
继续提问:还有什么其他的问题吗 或者提高可读性的方法
是的了,chatgpt 从可读性方面提出了建议,并给出了改进后的代码。不愧是新晋的葫芦代码小助手
代码段二
/**
* md5 加密
*/
func md5Encode(value string) string {
h := md5.New()
h.Write([]byte(value))
return fmt.Sprintf("%x", h.Sum(nil))
}
说实话,这段代码,葫芦自己都认为没什么问题,毕竟就三行代码,简单的md5加密
上AI
这段代码没有问题,只是可以对其增加错误处理和参数校验。根据之前的建议,以下是修改建议:
- 增加错误处理
func md5Encode(value string) (string, error) {
if value == "" {
return "", errors.New("value is empty")
}
h := md5.New()
if _, err := h.Write([]byte(value)); err != nil {
return "", err
}
return fmt.Sprintf("%x", h.Sum(nil)), nil
}
- 增加参数校验
func md5Encode(value string) (string, error) {
if value == "" {
return "", errors.New("value is empty")
}
// 校验是否包含敏感信息
if sensitive.Contains(value) {
return "", errors.New("value contains sensitive information")
}
h := md5.New()
if _, err := h.Write([]byte(value)); err != nil {
return "", err
}
return fmt.Sprintf("%x", h.Sum(nil)), nil
}
如果需要实现流式读取,可以将 value 参数改为 io.Reader 类型:
func md5Encode(reader io.Reader) (string, error) {
h := md5.New()
if _, err := io.Copy(h, reader); err != nil {
return "", err
}
return fmt.Sprintf("%x", h.Sum(nil)), nil
}
其中 io.Copy 函数实现了从 io.Reader 中读取数据并写入到 io.Writer 中的操作。
如果需要使用更安全的哈希算法,可以采用 SHA-256 或 SHA-512 等算法,例如:
func sha512Encode(value string) (string, error) {
if value == "" {
return "", errors.New("value is empty")
}
h := sha512.New()
if _, err := h.Write([]byte(value)); err != nil {
return "", err
}
return fmt.Sprintf("%x", h.Sum(nil)), nil
}
虽然没有什么问题,但chatgpt给出了更完善的方案,并给出了相应的修改后的代码
总结
通过三个真实代码片段的审查实验,我验证了ChatGPT在代码质量保障中的实际效果:
- HTTP请求:发现了缺失超时设置的隐患,给出了合理的修改建议
- 错误处理:指出了错误信息不够具体、缺乏上下文的问题
- 哈希算法:建议使用更安全的SHA-256替代MD5,并给出了流式读取的优化方案
核心收获:ChatGPT能发现人眼容易忽略的细节问题,尤其是在边界条件、安全性和代码规范方面表现出色。
十三Tech认为,AI辅助代码审查不是替代Code Review,而是让审查更加全面和高效。把AI当作你的"第二双眼睛",你会发现更多潜在的代码隐患。
关于十三 Tech 资深服务端研发,AI实践者,专注分享真实可落地的技术经验。 相信AI是程序员的最佳搭档,而非替代者。 让每一个程序员都能写出更优雅的代码!
联系方式:569893882@qq.com GitHub:@TriTechAI