Hi all,

I want to check the wisdom of the crowd on the following topic:

Suppose I am interested in fuzz testing an API using dvyukov/go-fuzz 
<https://github.com/dvyukov/go-fuzz>, and the primary API under test 
accepts relatively complex composite data types itself: func F(*Table) 
error, where the types below are minimally as complex as this:

type Entry struct {
Name  string
Date  time.Date
Child *Entry      // optional
Data  interface{} // optional and user-defined
}

type Table struct {
Attrs   map[string]string
Entries []*Entry
}

go-fuzz expects the fuzz entrypoints to be func Fuzz(data []byte) int, 
meaning *Table cannot be used directly without some intermediate 
serialization and deserialization.  Suppose that *Table has no regular 
on-disk format; what would you recommend as the approach to take toward 
generating an initial corpus so that go-fuzz can explore the search space 
and generate prospective crashers.

I've toyed around a bit with taking representative values and encoding them 
to disk with encoding/gob and then having go-fuzz deserialize, validate, 
and reject bad gob value candidates by returning -1.  Notwithstanding any 
issues inherent to encoding/gob, this does not feel like a particularly 
efficient on account of extraneous exercising of the gob encoding format, 
when really func F(*Table) error is what I want to exercise (as in commit 
my CPU cycles toward).

Potentially there are a few other ways of encoding *Table, like Protocol 
Buffers (with caveats), but encoding/binary is definitely out due to the 
opaque size of *Table.  The point still stands: I would ideally not want to 
exercise the serialization flow so much as handling of the type on which 
the data is projected.

What strategy would you use here?  I feel like there should be an obvious 
choice under my nose that I am somehow omitting.  And no, I don't want 
testing/quick for this, even though it can generate plenty of complex 
composite types at runtime.   

With warm regards,

Matt T. Proud

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/802159d8-ae45-4758-ac57-3d800bdc406en%40googlegroups.com.

Reply via email to