diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-05-07 15:42:28 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-05-07 15:42:28 +0200 |
| commit | 55a5e98a0a47bfac3653abb2d8f8f7b56d56685f (patch) | |
| tree | 6140b35bd59fb7104a1bf603fd01190e9df8204e /pkg | |
| parent | df6e2fb6dfe75e1b622641d180f399011dc77769 (diff) | |
pkg/ifuzz: move generated code to a separate package
This helps to ignore generated code with gometalinter.
There is currently no other way:
https://github.com/alecthomas/gometalinter/issues/270
Update #538
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/ifuzz/gen/gen.go | 4 | ||||
| -rw-r--r-- | pkg/ifuzz/generated/insns.go (renamed from pkg/ifuzz/insns.go) | 6 | ||||
| -rw-r--r-- | pkg/ifuzz/ifuzz.go | 19 | ||||
| -rw-r--r-- | pkg/ifuzz/ifuzz_test.go | 5 |
4 files changed, 26 insertions, 8 deletions
diff --git a/pkg/ifuzz/gen/gen.go b/pkg/ifuzz/gen/gen.go index 1368d2089..6dc93b728 100644 --- a/pkg/ifuzz/gen/gen.go +++ b/pkg/ifuzz/gen/gen.go @@ -164,7 +164,9 @@ nextInsn: fmt.Printf("// AUTOGENERATED FILE\n\n") fmt.Printf("package ifuzz\n\n") - fmt.Printf("var Insns = ") + fmt.Printf("import . \"github.com/google/syzkaller/pkg/ifuzz\"\n\n") + fmt.Printf("func init() { Insns = insns }\n\n") + fmt.Printf("var insns = ") serializer.Write(os.Stdout, insns) fmt.Fprintf(os.Stderr, "handled %v, skipped %v\n", len(insns), skipped) diff --git a/pkg/ifuzz/insns.go b/pkg/ifuzz/generated/insns.go index d3d654591..4f631cef4 100644 --- a/pkg/ifuzz/insns.go +++ b/pkg/ifuzz/generated/insns.go @@ -2,7 +2,11 @@ package ifuzz -var Insns = []*Insn{ +import . "github.com/google/syzkaller/pkg/ifuzz" + +func init() { Insns = insns } + +var insns = []*Insn{ {Name: "FADD", Extension: "X87", Mode: 15, Opcode: []uint8{216}, Modrm: true, Mod: -3, Rm: -1, Mem32: true, VexP: -1}, {Name: "FMUL", Extension: "X87", Mode: 15, Opcode: []uint8{216}, Modrm: true, Mod: -3, Reg: 1, Rm: -1, Mem32: true, VexP: -1}, {Name: "FCOMP", Extension: "X87", Mode: 15, Opcode: []uint8{216}, Modrm: true, Mod: -3, Reg: 3, Rm: -1, Mem32: true, VexP: -1}, diff --git a/pkg/ifuzz/ifuzz.go b/pkg/ifuzz/ifuzz.go index 87476fb95..985aa3501 100644 --- a/pkg/ifuzz/ifuzz.go +++ b/pkg/ifuzz/ifuzz.go @@ -1,16 +1,14 @@ // Copyright 2017 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. -//go:generate bash -c "echo -e 'package ifuzz\nvar Insns []*Insn' > insns.go" -//go:generate bash -c "go run gen/gen.go gen/all-enc-instructions.txt > /tmp/insns.go" -//go:generate mv /tmp/insns.go insns.go -//go:generate go fmt insns.go +//go:generate bash -c "go run gen/gen.go gen/all-enc-instructions.txt > generated/insns.go" // Package ifuzz allows to generate and mutate x86 machine code. package ifuzz import ( "math/rand" + "sync" ) const ( @@ -79,7 +77,15 @@ const ( var modeInsns [ModeLast][typeLast][]*Insn -func init() { +var ( + Insns []*Insn + initOnce sync.Once +) + +func initInsns() { + if len(Insns) == 0 { + panic("no instructions") + } initPseudo() for mode := 0; mode < ModeLast; mode++ { for _, insn := range Insns { @@ -101,6 +107,7 @@ func init() { // ModeInsns returns list of all instructions for the given mode. func ModeInsns(cfg *Config) []*Insn { + initOnce.Do(initInsns) if cfg.Mode < 0 || cfg.Mode >= ModeLast { panic("bad mode") } @@ -116,6 +123,7 @@ func ModeInsns(cfg *Config) []*Insn { } func Generate(cfg *Config, r *rand.Rand) []byte { + initOnce.Do(initInsns) var text []byte for i := 0; i < cfg.Len; i++ { insn := randInsn(cfg, r) @@ -125,6 +133,7 @@ func Generate(cfg *Config, r *rand.Rand) []byte { } func Mutate(cfg *Config, r *rand.Rand, text []byte) []byte { + initOnce.Do(initInsns) insns := split(cfg, text) retry := false for stop := false; !stop || retry || len(insns) == 0; stop = r.Intn(2) == 0 { diff --git a/pkg/ifuzz/ifuzz_test.go b/pkg/ifuzz/ifuzz_test.go index 0d9a41c56..bc5408a6f 100644 --- a/pkg/ifuzz/ifuzz_test.go +++ b/pkg/ifuzz/ifuzz_test.go @@ -1,13 +1,16 @@ // Copyright 2017 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. -package ifuzz +package ifuzz_test import ( "encoding/hex" "math/rand" "testing" "time" + + . "github.com/google/syzkaller/pkg/ifuzz" + _ "github.com/google/syzkaller/pkg/ifuzz/generated" ) func TestMode(t *testing.T) { |
