75 lines
1.3 KiB
Go
75 lines
1.3 KiB
Go
// Fuzz tests for unexported functions for use with the Go 1.18 fuzzer.
|
|
|
|
//go:build go1.18
|
|
|
|
package interp
|
|
|
|
import (
|
|
"math"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func FuzzParseFloatPrefix(f *testing.F) {
|
|
f.Add("")
|
|
f.Add("foo")
|
|
f.Add("The quick.")
|
|
f.Add("0")
|
|
f.Add("9")
|
|
f.Add("1.3e4")
|
|
f.Add("1.3E0")
|
|
f.Add("1.3e+5")
|
|
f.Add("1.3e-5")
|
|
f.Add("1E1000")
|
|
f.Add(" 1234 ")
|
|
f.Add("1234xyz")
|
|
f.Add("-1234567890")
|
|
f.Add("0x0")
|
|
f.Add("0X10")
|
|
f.Add("0x1234567890")
|
|
f.Add("0xabcdef")
|
|
f.Add("0xABCDEF")
|
|
f.Add("-0xa")
|
|
f.Add("+0XA")
|
|
f.Add("0xf.f")
|
|
f.Add("0xf.fp10")
|
|
f.Add("0xf.fp-10")
|
|
f.Add("0x.f")
|
|
f.Add("0xf.")
|
|
f.Add("0x.")
|
|
f.Add("nan")
|
|
f.Add("+nan")
|
|
f.Add("-nan")
|
|
f.Add("NAN")
|
|
f.Add("inf")
|
|
f.Add("+inf")
|
|
f.Add("-inf")
|
|
f.Add("INF")
|
|
|
|
f.Fuzz(func(t *testing.T, in string) {
|
|
nPrefix := parseFloatPrefix(in)
|
|
if nPrefix != 0 {
|
|
for i := 1; i <= len(in); i++ {
|
|
n, _ := parseFloatHelper(in[:i])
|
|
if n == nPrefix || math.IsNaN(n) && math.IsNaN(nPrefix) {
|
|
return
|
|
}
|
|
}
|
|
t.Fatalf("no ParseFloat match: %q", in)
|
|
}
|
|
})
|
|
}
|
|
|
|
func parseFloatHelper(s string) (float64, error) {
|
|
s = strings.TrimSpace(s)
|
|
s = strings.ToLower(s)
|
|
if s == "+nan" || s == "-nan" {
|
|
return math.NaN(), nil
|
|
}
|
|
if strings.Contains(s, "0x") && !strings.ContainsAny(s, "pP") {
|
|
s += "p0"
|
|
}
|
|
return strconv.ParseFloat(s, 64)
|
|
}
|