aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-05-07 15:42:28 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-05-07 15:42:28 +0200
commit55a5e98a0a47bfac3653abb2d8f8f7b56d56685f (patch)
tree6140b35bd59fb7104a1bf603fd01190e9df8204e /pkg
parentdf6e2fb6dfe75e1b622641d180f399011dc77769 (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.go4
-rw-r--r--pkg/ifuzz/generated/insns.go (renamed from pkg/ifuzz/insns.go)6
-rw-r--r--pkg/ifuzz/ifuzz.go19
-rw-r--r--pkg/ifuzz/ifuzz_test.go5
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) {