diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-01-24 10:51:38 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-01-24 10:53:21 +0100 |
| commit | 40723a067e2216f643485b732f90202b38b59e4b (patch) | |
| tree | 17d39b5d4804223ea592855885abfd3919e95077 /prog | |
| parent | 40c6a8ebf50872036d42c06e2e7a19b973539860 (diff) | |
prog: validate deserialized programs
The optimization change removed validation too aggressively.
We do need program validation during deserialization,
because we can get bad programs from corpus or hub.
Restore program validation after deserialization.
Diffstat (limited to 'prog')
| -rw-r--r-- | prog/clone.go | 6 | ||||
| -rw-r--r-- | prog/encoding.go | 9 | ||||
| -rw-r--r-- | prog/encodingexec.go | 6 | ||||
| -rw-r--r-- | prog/generation.go | 6 | ||||
| -rw-r--r-- | prog/mutation.go | 6 | ||||
| -rw-r--r-- | prog/validation.go | 3 |
6 files changed, 23 insertions, 13 deletions
diff --git a/prog/clone.go b/prog/clone.go index 6a6837148..c085b765f 100644 --- a/prog/clone.go +++ b/prog/clone.go @@ -15,8 +15,10 @@ func (p *Prog) Clone() *Prog { } p1.Calls = append(p1.Calls, c1) } - if err := p1.validate(); err != nil { - panic(err) + if debug { + if err := p1.validate(); err != nil { + panic(err) + } } return p1 } diff --git a/prog/encoding.go b/prog/encoding.go index 274e94a2d..151ff1935 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -27,8 +27,10 @@ func (p *Prog) String() string { } func (p *Prog) Serialize() []byte { - if err := p.validate(); err != nil { - panic("serializing invalid program") + if debug { + if err := p.validate(); err != nil { + panic("serializing invalid program") + } } buf := new(bytes.Buffer) vars := make(map[*Arg]int) @@ -173,6 +175,9 @@ func Deserialize(data []byte) (prog *Prog, err error) { if err := p.Err(); err != nil { return nil, err } + // This validation is done even in non-debug mode because deserialization + // procedure does not catch all bugs (e.g. mismatched types). + // And we can receive bad programs from corpus and hub. if err := prog.validate(); err != nil { return nil, err } diff --git a/prog/encodingexec.go b/prog/encodingexec.go index 5afd83fd6..304440d0e 100644 --- a/prog/encodingexec.go +++ b/prog/encodingexec.go @@ -35,8 +35,10 @@ const ( // SerializeForExec serializes program p for execution by process pid into the provided buffer. // If the provided buffer is too small for the program an error is returned. func (p *Prog) SerializeForExec(buffer []byte, pid int) error { - if err := p.validate(); err != nil { - panic(fmt.Errorf("serializing invalid program: %v", err)) + if debug { + if err := p.validate(); err != nil { + panic(fmt.Errorf("serializing invalid program: %v", err)) + } } var instrSeq uintptr w := &execContext{ diff --git a/prog/generation.go b/prog/generation.go index b08e98d31..8ead1c1c5 100644 --- a/prog/generation.go +++ b/prog/generation.go @@ -20,8 +20,10 @@ func Generate(rs rand.Source, ncalls int, ct *ChoiceTable) *Prog { p.Calls = append(p.Calls, c) } } - if err := p.validate(); err != nil { - panic(err) + if debug { + if err := p.validate(); err != nil { + panic(err) + } } return p } diff --git a/prog/mutation.go b/prog/mutation.go index 9841d31ca..04465a424 100644 --- a/prog/mutation.go +++ b/prog/mutation.go @@ -233,8 +233,10 @@ func (p *Prog) Mutate(rs rand.Source, ncalls int, ct *ChoiceTable, corpus []*Pro for _, c := range p.Calls { sanitizeCall(c) } - if err := p.validate(); err != nil { - panic(err) + if debug { + if err := p.validate(); err != nil { + panic(err) + } } } diff --git a/prog/validation.go b/prog/validation.go index f03ec10b8..564c0b060 100644 --- a/prog/validation.go +++ b/prog/validation.go @@ -17,9 +17,6 @@ type validCtx struct { } func (p *Prog) validate() error { - if !debug { - return nil - } ctx := &validCtx{make(map[*Arg]bool), make(map[*Arg]*Arg)} for _, c := range p.Calls { if err := c.validate(ctx); err != nil { |
