前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021年6月3日 Go生态洞察:Fuzzing技术的Beta测试

2021年6月3日 Go生态洞察:Fuzzing技术的Beta测试

作者头像
猫头虎
发布2024-04-08 14:53:39
720
发布2024-04-08 14:53:39
举报
文章被收录于专栏:猫头虎博客专区

2021年6月3日 Go生态洞察:Fuzzing技术的Beta测试

🐯 摘要

嘿,猫头虎博主在这里!今天,我们来聊聊Go生态中的一个激动人心的进展 — Fuzzing技术的Beta测试。对于热爱深入探索和挖掘技术细节的你,这将是一个不可错过的话题!

🌟 引言

2021年6月3日,Katie Hockman和Jay Conrod宣布,Go语言原生Fuzzing技术已经准备好进行Beta测试。Fuzzing是一种自动化测试方法,通过不断变化程序输入来发现潜在的问题,例如panic或bug。这种半随机的数据变异能够揭示现有单元测试可能错过的新代码覆盖区域,并发现那些通常不易察觉的边缘案例bug。由于Fuzzing能够触及这些边缘案例,它对于发现安全漏洞和漏洞尤其有价值。

📚 正文

🌐 开始使用Fuzzing

首先,你需要按照以下步骤安装并运行:

代码语言:javascript
复制
$ go install golang.org/dl/gotip@latest
$ gotip download

这会从master分支构建Go工具链。完成后,gotip命令可以替代go命令使用。现在,你可以运行如下命令:

代码语言:javascript
复制
$ gotip test -fuzz=Fuzz
🛠️ 编写Fuzz测试

Fuzz测试必须在*_test.go文件中作为函数FuzzXxx形式存在。该函数必须传递一个*testing.F参数,类似于TestXxx函数中传递的*testing.T参数。

以下是针对net/url包的Fuzz测试示例:

代码语言:javascript
复制
//go:build go1.18
// +build go1.18

package fuzz

import (
    "net/url"
    "reflect"
    "testing"
)

func FuzzParseQuery(f *testing.F) {
    f.Add("x=1&y=2")
    f.Fuzz(func(t *testing.T, queryStr string) {
        query, err := url.ParseQuery(queryStr)
        if err != nil {
            t.Skip()
        }
        queryStr2 := query.Encode()
        query2, err := url.ParseQuery(queryStr2)
        if err != nil {
            t.Fatalf("ParseQuery failed to decode a valid encoded query %s: %v", queryStr2, err)
        }
        if !reflect.DeepEqual(query, query2) {
            t.Errorf("ParseQuery gave different query after being encoded\nbefore: %v\nafter: %v", query, query2)
        }
    })
}

你可以在pkg.go.dev上阅读更多关于Fuzzing的内容,包括使用Go进行Fuzzing的概述以及新的testing.F类型的godoc文档

🚀 期望与限制

这是一个仍处于Beta阶段的新功能,因此你应该预期会遇到一些bug和功能不完整的情况。可以通过查看标有“fuzz”标签的问题跟踪器来了解现有的bug和缺失功能。

请注意,Fuzzing在运行时可能会消耗大量内存,并可能影响你的机器性能。go test -fuzz默认在并行的$GOMAXPROCS进程中运行Fuzzing。你可以通过显式设置go test-parallel标志来降低Fuzzing时使用的

进程数量。如果想获取更多信息,可以运行gotip help testflag阅读go test命令的文档。

同时要注意,Fuzzing引擎在运行时会将扩展测试覆盖范围的值写入$GOCACHE/fuzz目录下的Fuzz缓存。目前对Fuzz缓存中可写入的文件数量或总字节数没有限制,因此它可能占用大量存储空间(例如几GB)。你可以通过运行gotip clean -fuzzcache来清除Fuzz缓存。

📅 下一步

该功能将从Go 1.18版本开始提供。

如果你遇到任何问题或对功能有任何建议,请提交问题

对于该功能的讨论和一般反馈,你也可以参与Gophers Slack中的#fuzzing频道

祝你Fuzzing愉快!

知识点

说明

Fuzzing技术

自动化测试方法,用于发现潜在的panic或bug

Beta测试

Go原生Fuzzing技术的测试阶段

Fuzz测试编写

需在*_test.go文件中作为FuzzXxx函数存在

资源消耗

Fuzzing可能消耗大量内存和存储空间

Go版本支持

从Go 1.18版本开始提供

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2021年6月3日 Go生态洞察:Fuzzing技术的Beta测试
    • 🐯 摘要
      • 🌟 引言
        • 📚 正文
          • 🌐 开始使用Fuzzing
          • 🛠️ 编写Fuzz测试
          • 🚀 期望与限制
          • 📅 下一步
      相关产品与服务
      腾讯云服务器利旧
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档