Replace go-fuzz by Go's built-in fuzz tooling

As introduced by Go 1.18

Co-authored-by: Atsushi Watanabe <atsushi.w@ieee.org>
This commit is contained in:
Steffen Vogel
2023-01-23 12:26:52 +01:00
parent 325edd6527
commit 9422ebd185
86 changed files with 204 additions and 278 deletions

3
.github/.ci.conf vendored
View File

@@ -6,9 +6,6 @@ DISALLOWED_FUNCTIONS_EXCLUDED_DIRECTORIES="cmd example"
function _test_hook(){
set -e
# test fuzz inputs
go test -tags gofuzz -run TestFuzz -v .
# test with "debug" tag
go test -tags debug ./...

View File

@@ -9,22 +9,6 @@ bench:
go test -bench .
bench-record:
$(GO) test -bench . > "benchmarks/stun-go-$(GO_VERSION).txt"
fuzz-prepare-msg:
go-fuzz-build -func FuzzMessage -o stun-msg-fuzz.zip github.com/pion/stun
fuzz-prepare-typ:
go-fuzz-build -func FuzzType -o stun-typ-fuzz.zip github.com/pion/stun
fuzz-prepare-setters:
go-fuzz-build -func FuzzSetters -o stun-setters-fuzz.zip github.com/pion/stun
fuzz-msg:
go-fuzz -bin=./stun-msg-fuzz.zip -workdir=fuzz/stun-msg
fuzz-typ:
go-fuzz -bin=./stun-typ-fuzz.zip -workdir=fuzz/stun-typ
fuzz-setters:
go-fuzz -bin=./stun-setters-fuzz.zip -workdir=fuzz/stun-setters
fuzz-test:
go test -tags gofuzz -run TestFuzz -v .
fuzz-reset-setters:
rm -f -v -r stun-setters-fuzz.zip fuzz/stun-setters
lint:
@golangci-lint run ./...
@echo "ok"
@@ -39,9 +23,6 @@ bench-compare:
go test -bench . > bench.go-16
go-tip test -bench . > bench.go-tip
@benchcmp bench.go-16 bench.go-tip
install-fuzz:
go get -u github.com/dvyukov/go-fuzz/go-fuzz-build
go get github.com/dvyukov/go-fuzz/go-fuzz
install:
go get gortc.io/api
go get -u github.com/golangci/golangci-lint/cmd/golangci-lint

139
fuzz.go
View File

@@ -1,139 +0,0 @@
// +build gofuzz
package stun
import (
"encoding/binary"
"errors"
"fmt"
)
var m = New()
// FuzzMessage is go-fuzz endpoint for message.
func FuzzMessage(data []byte) int {
m.Reset()
// fuzzer dont know about cookies
binary.BigEndian.PutUint32(data[4:8], magicCookie)
// trying to read data as message
if _, err := m.Write(data); err != nil {
return 0
}
m2 := New()
if _, err := m2.Write(m.Raw); err != nil {
panic(err) // nolint
}
if m2.TransactionID != m.TransactionID {
panic("transaction ID mismatch") // nolint
}
if m2.Type != m.Type {
panic("type missmatch") // nolint
}
if len(m2.Attributes) != len(m.Attributes) {
panic("attributes length missmatch") // nolint
}
return 1
}
// FuzzType is go-fuzz endpoint for message type.
func FuzzType(data []byte) int {
t := MessageType{}
vt, _ := binary.Uvarint(data)
v := uint16(vt) & 0x1fff // first 3 bits are empty
t.ReadValue(v)
v2 := t.Value()
if v != v2 {
panic("v != v2") // nolint
}
t2 := MessageType{}
t2.ReadValue(v2)
if t2 != t {
panic("t2 != t") // nolint
}
return 0
}
type attr interface {
Getter
Setter
}
type attrs []struct {
g attr
t AttrType
}
func (a attrs) pick(v byte) struct {
g attr
t AttrType
} {
idx := int(v) % len(a)
return a[idx]
}
func FuzzSetters(data []byte) int {
var (
m1 = &Message{
Raw: make([]byte, 0, 2048),
}
m2 = &Message{
Raw: make([]byte, 0, 2048),
}
m3 = &Message{
Raw: make([]byte, 0, 2048),
}
)
attributes := attrs{
{new(Realm), AttrRealm},
{new(XORMappedAddress), AttrXORMappedAddress},
{new(Nonce), AttrNonce},
{new(Software), AttrSoftware},
{new(AlternateServer), AttrAlternateServer},
{new(ErrorCodeAttribute), AttrErrorCode},
{new(UnknownAttributes), AttrUnknownAttributes},
{new(Username), AttrUsername},
{new(MappedAddress), AttrMappedAddress},
{new(Realm), AttrRealm},
}
firstByte := byte(0)
if len(data) > 0 {
firstByte = data[0]
}
a := attributes.pick(firstByte)
value := data
if len(data) > 1 {
value = value[1:]
}
m1.WriteHeader()
m1.Add(a.t, value)
err := a.g.GetFrom(m1)
if errors.Is(err, ErrAttributeNotFound) {
fmt.Println("unexpected 404") // nolint
panic(err) // nolint
}
if err != nil {
return 1
}
m2.WriteHeader()
if err = a.g.AddTo(m2); err != nil {
// We allow decoding some text attributes
// when their length is too big, but
// not encoding.
if !IsAttrSizeOverflow(err) {
panic(err) // nolint
}
return 1
}
m3.WriteHeader()
v, err := m2.Get(a.t)
if err != nil {
panic(err) // nolint
}
m3.Add(a.t, v)
if !m2.Equal(m3) {
fmt.Println(m2, "not equal", m3) // nolint
panic("not equal") // nolint
}
return 1
}

View File

@@ -1,3 +0,0 @@
# Fuzzer corpus
fuzz directory contains corpus for fuzzer.

View File

@@ -1 +0,0 @@
bHnary.L+infinityndi

View File

@@ -1 +0,0 @@
145519152283668U806

View File

@@ -1,14 +0,0 @@
panic: BadFormat for message/cookie: 0 is invalid magic cookie (should be 2112a442)
goroutine 1 [running]:
github.com/pion/stun.FuzzMessage(0x7f2282f33000, 0x14, 0x200000, 0xc42000c740)
/tmp/go-fuzz-build544265286/gopath/src/github.com/pion/stun/fuzz.go:21 +0x356
go-fuzz-dep.Main(0x511330)
/tmp/go-fuzz-build544265286/goroot/src/go-fuzz-dep/main.go:49 +0xde
main.main()
/tmp/go-fuzz-build544265286/gopath/src/github.com/pion/stun/go.fuzz.main/main.go:10 +0x2d
goroutine 17 [syscall, locked to thread]:
runtime.goexit()
/tmp/go-fuzz-build544265286/goroot/src/runtime/asm_amd64.s:2197 +0x1
exit status 2

View File

@@ -1 +0,0 @@
"00\x00\x000000000000000000"

View File

@@ -1,4 +0,0 @@
panic: BadFormat for message/cookie: 0 is invalid magic cookie (should be 2112a442)
github.com/pion/stun.FuzzMessage
go-fuzz-dep.Main
main.main

View File

@@ -1 +0,0 @@
~<7E><><EFBFBD>^L.

View File

@@ -1 +0,0 @@
8N_eX6_xy_g_3_.t> HcSg__j_Wi3_YV_4oalCf6U90ZzDyR_zh

View File

@@ -1 +0,0 @@
t<EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD><EFBFBD><01>yp.size >amd64p32 4G

View File

@@ -1 +0,0 @@
8N_eX6_xy_g_3_._7943P6Sn6z2_a_w74tPp9a_nf4A__Z__SUo_iRi1__luyG4_H0y__qsrUYi5Q9WvPpw25nK9_nZK4_9i5t_4Z_5im8e_5aW0> HcSg__j_Wi3_YV_4oalCf6U90ZzDyR_zh

View File

@@ -1 +0,0 @@
t.xcount >t.0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 > 0G0G

View File

@@ -1 +0,0 @@
t.gsErP_IH_ol7_mN7_8_r43e_tKnO__a_9TwJV7G_rjz8_c_Mq3y_5H__61__ >tt.xcount >txcount0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 > 0G0G0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 > 0G0G

View File

@@ -1 +0,0 @@
t t.xcount >8_Q.0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 >0G0G5R_Jk3K_4C___7__6AksK_1_EnJk__nhuq_t_L_8Bs_hP7D___bz_MaN587__c_ArhrW_F_11KJ_j7u1_5W8._7943P6Sn6z2_a_w74tPp9a_nf4A__Z__SUo_iRi1__luyG4_H0y__qsrUYi5Q9WvPpw25nK9_nZK4_9i5t_4Z_5im8e_5aW0> HcSg__j_Wi3_YV_4oalCf6U90ZzDyR_zh0G

View File

@@ -1 +0,0 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソソ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD>نϽ<EFBFBD>ソソソソ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -1 +0,0 @@
<EFBFBD><EFBFBD><EFBFBD>

View File

@@ -1 +0,0 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD>

View File

@@ -1 +0,0 @@
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD>ソソソソ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -1 +0,0 @@
signal: interrupt

View File

@@ -1,5 +0,0 @@
panic: v != v2
panic
github.com/cydev/stun.FuzzType
go-fuzz-dep.Main
main.main

View File

@@ -1 +0,0 @@
signal: interrupt

View File

@@ -1,96 +1,151 @@
// +build gofuzz
package stun
import (
"os"
"path/filepath"
"strings"
"encoding/binary"
"errors"
"testing"
)
func TestMessageType_FuzzerCrash1(t *testing.T) {
input := []byte("\x9c\xbe\x03")
FuzzType(input)
func FuzzMessage(f *testing.F) {
msg1 := New()
f.Fuzz(func(t *testing.T, data []byte) {
msg1.Reset()
// Fuzzer does not know about cookies
if len(data) >= 8 {
binary.BigEndian.PutUint32(data[4:8], magicCookie)
}
// Trying to read data as message
if _, err := msg1.Write(data); err != nil {
return // We expect invalid messages to fail here
}
msg2 := New()
if _, err := msg2.Write(msg1.Raw); err != nil {
t.Fatalf("Failed to write: %s", err)
}
if msg2.TransactionID != msg1.TransactionID {
t.Fatal("Transaction ID mismatch")
}
if msg2.Type != msg1.Type {
t.Fatal("Type mismatch")
}
if len(msg2.Attributes) != len(msg1.Attributes) {
t.Fatal("Attributes length mismatch")
}
})
}
func TestMessageCrash2(t *testing.T) {
input := []byte("00\x00\x000000000000000000")
FuzzMessage(input)
func FuzzType(f *testing.F) {
f.Fuzz(func(t *testing.T, data uint16) {
v := data & 0x1fff // First 3 bits are empty
t1 := MessageType{}
t1.ReadValue(v)
v2 := t1.Value()
if v != v2 {
t.Fatal("v != v2")
}
t2 := MessageType{}
t2.ReadValue(v2)
if t2 != t1 {
t.Fatal("t2 != t1")
}
})
}
func corpus(t *testing.T, function, typ string) [][]byte {
var data [][]byte
p := filepath.Join("fuzz", function, typ)
f, err := os.Open(p)
if err != nil {
if os.IsNotExist(err) {
t.Skip("does not exist")
func FuzzSetters(f *testing.F) {
f.Fuzz(func(t *testing.T, firstByte byte, value []byte) {
var (
m1 = &Message{
Raw: make([]byte, 0, 2048),
}
m2 = &Message{
Raw: make([]byte, 0, 2048),
}
m3 = &Message{
Raw: make([]byte, 0, 2048),
}
)
attrs := attributes{
{new(Realm), AttrRealm},
{new(XORMappedAddress), AttrXORMappedAddress},
{new(Nonce), AttrNonce},
{new(Software), AttrSoftware},
{new(AlternateServer), AttrAlternateServer},
{new(ErrorCodeAttribute), AttrErrorCode},
{new(UnknownAttributes), AttrUnknownAttributes},
{new(Username), AttrUsername},
{new(MappedAddress), AttrMappedAddress},
{new(Realm), AttrRealm},
}
t.Fatal(err)
}
list, err := f.Readdir(-1)
if err != nil {
t.Fatal(err)
}
for _, d := range list {
if strings.Contains(d.Name(), ".") {
// Skipping non-raw files.
continue
attr := attrs.pick(firstByte)
m1.WriteHeader()
m1.Add(attr.t, value)
err := attr.g.GetFrom(m1)
if errors.Is(err, ErrAttributeNotFound) {
t.Fatalf("Unexpected 404: %s", err)
}
df, err := os.Open(filepath.Join(p, d.Name()))
if err != nil {
return
}
m2.WriteHeader()
if err = attr.g.AddTo(m2); err != nil {
// We allow decoding some text attributes
// when their length is too big, but
// not encoding.
if !IsAttrSizeOverflow(err) {
t.Fatal(err)
}
return
}
m3.WriteHeader()
v, err := m2.Get(attr.t)
if err != nil {
t.Fatal(err)
}
buf := make([]byte, 5000)
n, _ := df.Read(buf)
data = append(data, buf[:n])
df.Close()
}
return data
}
m3.Add(attr.t, v)
func TestFuzzMessage_Coverage(t *testing.T) {
for _, buf := range corpus(t, "stun-msg", "corpus") {
FuzzMessage(buf)
}
}
func TestFuzzMessage_Crashers(t *testing.T) {
for _, buf := range corpus(t, "stun-msg", "crashers") {
FuzzMessage(buf)
}
}
func TestFuzzType_Coverage(t *testing.T) {
for _, buf := range corpus(t, "stun-typ", "corpus") {
FuzzType(buf)
}
}
func TestFuzzType_Crashers(t *testing.T) {
for _, buf := range corpus(t, "stun-typ", "crashers") {
FuzzType(buf)
}
if !m2.Equal(m3) {
t.Fatalf("Not equal: %s != %s", m2, m3)
}
})
}
func TestAttrPick(t *testing.T) {
attributes := attrs{
attrs := attributes{
{new(XORMappedAddress), AttrXORMappedAddress},
}
for i := byte(0); i < 255; i++ {
attributes.pick(i)
attrs.pick(i)
}
}
func TestFuzzSetters_Crashers(t *testing.T) {
for _, buf := range corpus(t, "stun-setters", "crashers") {
FuzzSetters(buf)
}
type attr interface {
Getter
Setter
}
func TestFuzzSetters_Coverage(t *testing.T) {
for _, buf := range corpus(t, "stun-setters", "corpus") {
FuzzSetters(buf)
}
type attributes []struct {
g attr
t AttrType
}
func (a attributes) pick(v byte) struct {
g attr
t AttrType
} {
idx := int(v) % len(a)
return a[idx]
}

View File

@@ -3,9 +3,6 @@
set -e
touch coverage.txt
# test fuzz inputs
go test -tags gofuzz -run TestFuzz -v .
# quick-test without -race
go test ./...

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("11\x00\x17\x1aä\xbdC<64><43><EFBFBD>:O\xbd\xbf\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("be\x00\x03,\x9b\xfb\x84\xb6\xa0\x00\x80\x00.L+|nfin\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("-97759226\xd5m.\x91\xec\xfeI\xd7\x00 \x1aä\xbd\x00\x14\xbf\xbd俽\uffc0\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x9d\x00\xbf\xbd:O\xbd\xbf\x80\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00expected quoted string\x00\x00\xbf\x00\x00\xbf\x00\x00\x00\x00\xbf\x00\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("14\x00\x04float6\xbd\xbf\xefO\xbd\xbfソ\xef4191")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("145519152283668U\x03806")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("14\x00\x0e\x10\x00\xbf\xbdC<64><43><EFBFBD>:O\xbd\xbf\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("bHnary.L+infinityndi")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("be\x00\x00\x80\x00.L+|nfinityndi")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("00\x00\x000000000000000000")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("11\x00!\x1aä\xbd\x00\x14\xbf\xbd쿽<64>:O\xbd\xbf\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\x00\xbf\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("14\x00\n=<3D>C<EFBFBD><43><EFBFBD>:O\x91\xbf\x00\x00\x01\x00\x00\x00\x00\x01")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("11\x00\x14\x10\x00\xbf\xbdC<64><43><EFBFBD>:O\xbd\xbf\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("14\x00\n=<3D>C<EFBFBD><43><EFBFBD>:O\xbd\xbf\x00\x00\x01\x004191")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("be\x00\x05\xff\xff\x05\x84\xb6\xa0\x00\xf5,\x9b\x00,\x9b\x00.Lf\x00\x00\x00in\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("1\x00\x00\x01\x00<30>C<EFBFBD><43><EFBFBD>:O\xbd\xbf\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("14\x00\n=<3D>C<EFBFBD><43>\xef\x00\x00\x00@\xbd\xbf\x00\x00\x00\x01\x00\x00\x01\x0041")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("14\x00\n=<3D>C<EFBFBD><43><EFBFBD>:O\xbd\xbf\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("11\x00 \x1aä\xbd\x00\x14\xbf\xbd俽<64>:O\xbd\xbf\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\x00\xbf\x00\x00\xbf\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('t')
[]byte(".gsErP_IH_ol7_mN7_8_r43e_tKnO__a_9TwJV7G_rjz8_c_Mq3y_5H__61__ \t>tt.xcount >txcount0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 > 0G0G0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 >\t 0G0G")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('t')
[]byte(".xcount >t.0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 > 0G0G")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('G')
[]byte("\x00\x01\xbf\xef{")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('8')
[]byte("N_eX6_xy_g_3_.t> \tHcSg__j_Wi3_YV_4oalCf6U90ZzDyR_zh")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('t')
[]byte(".xcount > 0G")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('t')
[]byte("\xc0\x85\xefZ\xbc\xfb\x01\xe1yp.size >amd64p32 4G")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('8')
[]byte("N_eX6_xy_g_3_._7943P6Sn6z2_a_w74tPp9a_nf4A__Z__SUo_iRi1__luyG4_H0y__qsrUYi5Q9WvPpw25nK9_nZK4_9i5t_4Z_5im8e_5aW0> \tHcSg__j_Wi3_YV_4oalCf6U90ZzDyR_zh")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('t')
[]byte(" t.xcount >8_Q.0N59lpU_n47gwRq6d0DS__j_wW__9Qu4Oz__uXMR7_g5__O_m__C_4 >0G0G5R_Jk3K_4C___7__6AksK_1_EnJk__nhuq_t_L_8Bs_hP7D___bz_MaN587__c_ArhrW_F_11KJ_j7u1_5W8\x01._7943P6Sn6z2_a_w74tPp9a_nf4A__Z__SUo_iRi1__luyG4_H0y__qsrUYi5Q9WvPpw25nK9_nZK4_9i5t_4Z_5im8e_5aW0> \t \tHcSg__j_Wi3_YV_4oalCf6U90ZzDyR_zh0G")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('~')
[]byte("\xf0\xf1\x9d^\x0f\bL.")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('G')
[]byte("")

View File

@@ -0,0 +1,3 @@
go test fuzz v1
byte('7')
[]byte("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")

View File

@@ -0,0 +1,2 @@
go test fuzz v1
uint16(0)

View File

@@ -0,0 +1,2 @@
go test fuzz v1
uint16(0xbe9c)

View File

@@ -0,0 +1,2 @@
go test fuzz v1
uint16(0xbdef)

View File

@@ -0,0 +1,2 @@
go test fuzz v1
uint16(0x92fa)

View File

@@ -0,0 +1,2 @@
go test fuzz v1
uint16(0x5d5b)