范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

GO语言(十六)模糊测试入门(上)

  本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试,随机数据会针对您的测试运行,以尝试找出漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击。
  在本教程中,您将为一个简单的函数编写一个模糊测试,运行 go 命令,并调试和修复代码中的问题。
  先决条件Go 1.18 或更高版本的安装。 有关安装说明,请参阅 安装 Go。 用于编辑代码的工具。 您拥有的任何文本编辑器都可以正常工作。 一个命令终端。 Go 在 Linux 和 Mac 上的任何终端以及 Windows 中的 PowerShell 或 cmd 上都能很好地工作。 支持模糊测试的环境。 目前仅在 AMD64 和 ARM64 架构上使用覆盖检测进行模糊测试。
  为您的代码创建一个文件夹
  首先,为您要编写的代码创建一个文件夹。
  1、打开命令提示符并切换到您的主目录。
  在 Linux 或 Mac 上: $ cd
  在 Windows 上: C:> cd %HOMEPATH%
  2、在命令提示符下,为您的代码创建一个名为 fuzz 的目录。 $ mkdir fuzz $ cd fuzz
  3、创建一个模块来保存您的代码。
  运行go mod init命令,为其提供新代码的模块路径。 $ go mod init example/fuzz go: creating new go.mod: module example/fuzz
  接下来,您将添加一些简单的代码来反转字符串,稍后我们将对其进行模糊测试。
  添加代码进行测试
  在此步骤中,您将添加一个函数来反转字符串。
  1、编写代码
  a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 main.go 的文件。
  b.进入 main.go,在文件顶部,粘贴以下包声明。 package main
  独立程序(与库相反)始终位于 package 中main。
  c.在包声明下,粘贴以下函数声明。 func Reverse(s string) string {     b := []byte(s)     for i, j := 0, len(b)-1; i < len(b)/2; i, j = i+1, j-1 {         b[i], b[j] = b[j], b[i]     }     return string(b) }
  此函数将接受string,使用byte进行循环 ,并在最后返回反转的字符串。
  d.在 main.go 顶部的包声明下方,粘贴以下 main函数来初始化一个字符串,反转它,打印输出,然后重复。 func main() {     input := "The quick brown fox jumped over the lazy dog"     rev := Reverse(input)     doubleRev := Reverse(rev)     fmt.Printf("original: %q ", input)     fmt.Printf("reversed: %q ", rev)     fmt.Printf("reversed again: %q ", doubleRev) }
  此函数将运行一些Reverse操作,然后将输出打印到命令行。这有助于查看运行中的代码,并可能有助于调试。
  e.该main函数使用 fmt 包,因此您需要导入它。
  第一行代码应如下所示: package main  import "fmt"
  2、运行代码
  从包含 main.go 的目录中的命令行,运行代码。 $ go run . original: "The quick brown fox jumped over the lazy dog" reversed: "god yzal eht revo depmuj xof nworb kciuq ehT" reversed again: "The quick brown fox jumped over the lazy dog"
  可以看到原来的字符串,反转它的结果,然后再反转它的结果,就相当于原来的了。
  现在代码正在运行,是时候测试它了。
  添加单元测试
  在这一步中,您将为Reverse函数编写一个基本的单元测试。
  1、编写代码
  a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 reverse_test.go 的文件。
  b.将以下代码粘贴到 reverse_test.go 中。 package main  import (     "testing" )  func TestReverse(t *testing.T) {     testcases := []struct {         in, want string     }{         {"Hello, world", "dlrow ,olleH"},         {" ", " "},         {"!12345", "54321!"},     }     for _, tc := range testcases {         rev := Reverse(tc.in)         if rev != tc.want {                 t.Errorf("Reverse: %q, want %q", rev, tc.want)         }     } }
  这个简单的测试将断言列出的输入字符串将被正确反转。
  2、运行代码
  使用运行单元测试go test $ go test PASS ok      example/fuzz  0.013s
  接下来,您将单元测试更改为模糊测试。
  添加模糊测试
  单元测试有局限性,即每个输入都必须由开发人员添加到测试中。模糊测试的一个好处是它可以为您的代码提供输入,并且可以识别您提出的测试用例没有达到的边缘用例。
  在本节中,您将单元测试转换为模糊测试,这样您就可以用更少的工作生成更多的输入!
  请注意,您可以将单元测试、基准测试和模糊测试保存在同一个 *_test.go 文件中,但对于本示例,您将单元测试转换为模糊测试。
  1、编写代码
  在您的文本编辑器中,将 reverse_test.go 中的单元测试替换为以下模糊测试。 func FuzzReverse(f *testing.F) {     testcases := []string{"Hello, world", " ", "!12345"}     for _, tc := range testcases {         f.Add(tc)  // Use f.Add to provide a seed corpus     }     f.Fuzz(func(t *testing.T, orig string) {         rev := Reverse(orig)         doubleRev := Reverse(rev)         if orig != doubleRev {             t.Errorf("Before: %q, after: %q", orig, doubleRev)         }         if utf8.ValidString(orig) && !utf8.ValidString(rev) {             t.Errorf("Reverse produced invalid UTF-8 string %q", rev)         }     }) }
  Fuzzing 也有一些限制。在您的单元测试中,您可以预测Reverse函数的预期输出,并验证实际输出是否满足这些预期。
  例如,在测试用例Reverse("Hello, world")中,单元测试将返回指定为"dlrow ,olleH".
  模糊测试时,您无法预测预期输出,因为您无法控制输入。
  但是,Reverse您可以在模糊测试中验证函数的一些属性。在这个模糊测试中检查的两个属性是:
  (1)将字符串反转两次保留原始值
  (2)反转的字符串将其状态保留为有效的 UTF-8。
  注意单元测试和模糊测试之间的语法差异: 该函数以 FuzzXxx 而不是 TestXxx 开头,取*testing.F 而不是*testing.T 在您希望看到t.Run执行的地方,您会看到f.Fuzz 哪个采用模糊目标函数,其参数是*testing.T以及要模糊的类型。单元测试的输入作为种子语料库输入提供,使用f.Add.
  (3)确保新包unicode/utf8已导入。 package main  import (     "testing"     "unicode/utf8" )
  随着单元测试转换为模糊测试,是时候再次运行测试了。
  2、运行代码
  a.在不进行模糊测试的情况下运行模糊测试,以确保种子输入通过。 $ go test PASS ok      example/fuzz  0.013s
  如果您在该文件中有其他测试,您也可以运行go test -run=FuzzReverse,并且您只想运行模糊测试。
  b.运行FuzzReverse模糊测试,查看是否有任何随机生成的字符串输入会导致失败。这是使用go test新标志-fuzz执行的。 $ go test -fuzz=Fuzz fuzz: elapsed: 0s, gathering baseline coverage: 0/3 completed fuzz: elapsed: 0s, gathering baseline coverage: 3/3 completed, now fuzzing with 8 workers fuzz: minimizing 38-byte failing input file... --- FAIL: FuzzReverse (0.01s)     --- FAIL: FuzzReverse (0.00s)         reverse_test.go:20: Reverse produced invalid UTF-8 string " Ý"      Failing input written to testdata/fuzz/FuzzReverse/af69258a12129d6cbba438df5d5f25ba0ec050461c116f777e77ea7c9a0d217a     To re-run:     go test -run=FuzzReverse/af69258a12129d6cbba438df5d5f25ba0ec050461c116f777e77ea7c9a0d217a FAIL exit status 1 FAIL    example/fuzz  0.030s
  模糊测试时发生故障,导致问题的输入被写入将在下次运行的种子语料库文件中go test,即使没有-fuzz标志也是如此。要查看导致失败的输入,请在文本编辑器中打开写入 testdata/fuzz/FuzzReverse 目录的语料库文件。您的种子语料库文件可能包含不同的字符串,但格式相同。 go test fuzz v1 string("泃")
  语料库文件的第一行表示编码版本。以下每一行代表构成语料库条目的每种类型的值。由于 fuzz target 只需要 1 个输入,因此版本之后只有 1 个值。
  c.运行没有-fuzz标志的go test; 新的失败种子语料库条目将被使用: $ go test --- FAIL: FuzzReverse (0.00s)     --- FAIL: FuzzReverse/af69258a12129d6cbba438df5d5f25ba0ec050461c116f777e77ea7c9a0d217a (0.00s)         reverse_test.go:20: Reverse produced invalid string FAIL exit status 1 FAIL    example/fuzz  0.016s
  由于我们的测试失败,是时候调试了。

Python如何提取邮件内容今日分享主题如何使用Python从邮件里面提取用户返回的线上问题内容并做解析,通过拿到的数据信息进行分析整理,然后进行封装请求禅道里的接口进行提交,提交请求过程中会对数据库中是否存难怪小米手机耗电这么快!原来是这4个功能没有开启,涨知识了导读难怪小米手机耗电这么快!原来是这4个功能没有开启,涨知识了身边有很多在用小米手机的朋友反应手机经常耗电快,才用了不久就需要频繁充电,到底是使用习惯问题还是电池这么不耐用呢?小米诺基亚2760Flip4G翻盖手机曝光,运行KaiOSIT之家12月19日消息,NokiaPowerUser最近的一份报告称,一款型号为TA1398的诺基亚N139DL翻盖手机出现在FCC(联邦通信委员会)平台上,该设备可能会以诺基亚美团众包兼职的一天最近突然觉得自己特别的消沉,提不起精神来,尤其到了周末,感觉自己在家里就像没有灵魂的躯壳一样,躺着玩手机,躺着看电视,躺着干一切事情,可悲的事,过去之后竟然不知道自己看了什么。于是15楼财经企业巨亏242亿,三名高管年薪近12亿!商汤科技上市究竟能带来什么?商汤科技在港IPO之际,突遭变故,导致其被迫延期上市时间,已收到的申请款将悉数退还所有申请人。据了解,商汤科技拟募资约为56。55亿港元。不过市场所关注的,却是非常刺眼的一个反差。申通快递暴力分拣叫不满客户发顺丰,官方回应开除言论不当人员处罚承包区记者白帆编辑12月19日,一则关于申通快递暴力分拣的视频在网上流传。视频内容显示,申通吉林长春经开二区网点的工作人员对分拣的快递随意抛扔。且据拍摄视频的吕先生表示,暴力分拣的情况经字节秋招二面把我干懵了,问我SYN报文什么情况下会被丢弃?大家好,我是小林。之前有个读者在秋招面试的时候,被问了这么一个问题SYN报文什么情况下会被丢弃?好家伙,现在面试都问那么细节了吗?不过话说回来,这个问题跟工作上也是有关系的,因为我特斯拉电机到底是什么水平?揭秘特斯拉永磁同步电机,太先进了这两年特斯拉的电动车卖的是越来越好,不过特斯拉还要应对同样进展迅速的追赶者。在这个竞争激烈的新能源市场里,特斯拉CEO马斯克不得不突然要求特斯拉发展自己的电机技术,帮助特斯拉成为电深度解密互联网科技公司本质回顾上期文章智能手机是什么?有什么用?我们知道了一个最基本的事实智能手机是覆盖全球互联网所有领域的超级基础设施!电商金融娱乐服务游戏社交教育医疗等系列平台都寄生在人民的智能手机之上你知道为什么这么多行业都渐渐衰落了吗大家好,我是秋沫说到马云,相信大家并不陌生,阿里巴巴的创始人,不喜欢钱的他时至今日退休已有一段时间了,但是他所说过的话,所做过的事依然备受关注。特别是他创立的淘宝支付宝等平台,影响商汤科技被制裁,究竟厉害在哪儿?哈佛指出关键,美高管为此辞职近段时间,美方的制裁大棒又开始疯狂挥舞,不只是针对我们的芯片领域,现在又盯上了人工智能领域,理由还是那些所谓的影响他们安全,于是开始屡屡下黑手。近期,美方两次对我国企业下手,我国A
大数据入门实时计算数据架构演变历程大数据处理技术,随着大数据时代的发展变化,也在不断迭代更新,到了近几年,实时流计算占据主导趋势,企业级的平台开发任务当中,实时计算数据架构的地位变得愈加重要。今天的大数据入门分享,大数据基础ORM框架入门简介作为大数据开发技术者,需要掌握扎实的Java基础,这是不争的事实,所以对于Java开发当中需要掌握的重要框架技术,也需要有相应程度的掌握,比如说ORM框架。今天的大数据基础分享,我大数据入门Scala函数式编程在大数据的学习当中,学到Spark部分,就免不了需要Scala这门语言了,Scala是Spark框架的原生编程语言,想要真正把Spark搞懂,那么对Scala自然也需要相应程度的掌大数据入门SparkCore开发调优原则大数据计算引擎当中,Spark受到的重视是越来越多的,尤其是对数据处理实时性的要求越来越高,Hadoop原生的MapReduce引擎受到诟病,Spark的性能也需要不断调整优化。今大数据学习Mybatis基础入门对于大数据技术开发者而言,Mybatis作为一个优秀的持久层框架,是需要具备的一项重要基础。涉及到数据存储数据查询,Mybatis内部封装好JDBC,可以大大提升开发效率。今天的大大数据流处理框架SparkStreaming与Storm大数据计算的第一代框架Hadoop,是致力于解决离线计算的问题而产生的,在离线批处理上性能优异,但是在实时流处理上,一直被诟病。Hadoop之后,Spark和Storm在流处理上成大数据入门Zookeeper结构体系Zookeeper作为大数据技术生态当中的一个分布式服务框架,也可以算是Hadoop的一个重要子项目,最初作为MapReduce的协调服务组件而存在,后来独立出来,负责整个集群的协大数据入门大数据环境下的数据仓库大数据时代,大数据存储的解决方案,往往涉及到数据仓库的选型策略。从传统时期的数据仓库,到大数据环境下的数据仓库,其核心的技术架构是在随着最新技术趋势而变化的。今天的大数据入门分享,谷歌发布企业AI工具Essentials,MagicLeap为合作伙伴查看引用信息源请点击映维网致力于企业市场的MagicLeap最近与谷歌非常亲密(映维网2021年10月13日)致力于企业市场的MagicLeap最近与谷歌非常亲密。例如,Magic2021高通XR挑战赛技术分享HoloLogic全息协同平台研发(映维网2021年10月11日)由高通公司(Qualcomm)携手XR产业链众多合作伙伴共同打造的2021高通XR生态合作伙伴大会已于2021年9月23日在青岛金沙滩希尔顿酒店举行2021高通XR挑战赛技术分享EnterVR单联机及多平台移植开发(映维网2021年10月11日)由高通公司(Qualcomm)携手XR产业链众多合作伙伴共同打造的2021高通XR生态合作伙伴大会已于2021年9月23日在青岛金沙滩希尔顿酒店举行