Fuzzing en Go
Un objetivo de fuzz recibe entradas al azar hasta hallar una que rompa la propiedad.
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
func FuzzReverse(f *testing.F) {
f.Add("typestar")
f.Add("")
f.Fuzz(func(t *testing.T, input string) {
once := Reverse(input)
twice := Reverse(once)
if twice != input {
t.Errorf("round trip: %q -> %q -> %q", input, once, twice)
}
if utf8.ValidString(input) && !utf8.ValidString(once) {
t.Errorf("reverse broke utf8 for %q", input)
}
})
}
Cómo funciona
f.Addsiembra el corpus con valores interesantes conocidos.f.Fuzzrecibe argumentos generados de los tipos sembrados.- Aserta una propiedad, no una salida específica.
Palabras clave y builtins usados aquí
forfunciflenreturnrunestring
El intento, en números
- Líneas
- 23
- Caracteres a escribir
- 509
- Tokens
- 168
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 92 segundos.
Paso 2 de 3 en Medir y generar; paso 9 de 13 en Pruebas.