iT邦幫忙

2022 iThome 鐵人賽

DAY 25
1
DevOps

Golang X DevOps系列 第 25

Day25 - Introduce to Golang Fuzzing

  • 分享至 

  • xImage
  •  
  • 今天我們來看看我們 Golang 中的 Fuzzing

先來弄個簡單的小程式

  • 記得之前的步驟先在資料夾裡面 go mod init
go mod init go/fuzz
  • 然後我們提供一個簡單的 function
package main

import "fmt"

// 簡單的把句子反過來
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)
}

// 看一下 反轉一次和兩次的結果
func main() {
    input := "iron man write quick in thirty days"
    rev := Reverse(input)
    doubleRev := Reverse(rev)
    fmt.Printf("origin: %q\n", input)
    fmt.Printf("reversed: %q\n", rev)
    fmt.Printf("after reversed twice: %q\n", doubleRev)
}

把它加上 Fuzzing Test

  • 跟 Unit test 一樣, Fuzzing 一樣共用 *_test.go的檔案,所以我們要幫它加一個 *_test.go的 File
  • 我幫它取名叫 reverse_test.go
package main

import (
    "testing"
    "unicode/utf8"
)

func FuzzReverse(f *testing.F) {
    testcases := []string{"Hello, iron man", " ", "98765#"}
    for _, tc := range testcases {
        f.Add(tc)  // 把 testcase 加進 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 Test不注重在 Test data 嘛?為什麼還要有Test Case? 不是 random 嘛?
  • 中間的 Seed Corpus是什麼東西?

解釋

  • 我們先來解釋 Test data
  • 在 Fuzzing 中, Test data 仍是被需要的,甚至在裡面還是門學問, random也不是真正的隨機亂生資料,而是指它會從你給的 Test Data 中去組合,組合包括對 Test data做 Mutation,位元運算, 或是XOR......等有規律的操作
  • 而從上述組合中得出來的結果會被我們當作是 Input, 這些 Input 的組合我們稱作 Seed Corpus,而這些 Seed 的選擇將會影響 Fuzzing 的效率和測試的覆蓋率(所以還有論文特別在做 Seed Selection)

我有看到留言有人想要聽更多 Fuzzing,但本篇對 Fuzzing 的解釋也不能到很全面,想了解更全面的 Fuzzing 可以去看今年另一位大大寫的文章


上一篇
Day24 - Fuzzing Test v.s Unit Testing
下一篇
Day26 - Introduce to Golang Fuzzing (2)
系列文
Golang X DevOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
雷N
iT邦研究生 1 級 ‧ 2022-10-05 00:04:04

https://ithelp.ithome.com.tw/upload/images/20221005/20104930GQWEBk6BZd.png

我要留言

立即登入留言