mirror of
https://github.com/reactos/syzkaller.git
synced 2024-11-23 19:39:40 +00:00
55565fa037
Fix several nasty bugs in minimization that could lead to almost arbitrary results. These bugs affected both crash minimization and corpus population. Extend the randomized test to catch these bugs. Add additional asserts to code to catch similar bugs in future. Reported-by @xairy
92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
// 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 prog
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// Export guts for testing.
|
|
|
|
func init() {
|
|
debug = true
|
|
}
|
|
|
|
var (
|
|
CalcChecksumsCall = calcChecksumsCall
|
|
InitTest = initTest
|
|
)
|
|
|
|
func initTargetTest(t *testing.T, os, arch string) *Target {
|
|
t.Parallel()
|
|
target, err := GetTarget(os, arch)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return target
|
|
}
|
|
|
|
func randSource(t *testing.T) rand.Source {
|
|
seed := time.Now().UnixNano()
|
|
if os.Getenv("TRAVIS") != "" {
|
|
seed = 0 // required for deterministic coverage reports
|
|
}
|
|
t.Logf("seed=%v", seed)
|
|
return rand.NewSource(seed)
|
|
}
|
|
|
|
func iterCount() int {
|
|
iters := 1000
|
|
if testing.Short() {
|
|
iters /= 10
|
|
}
|
|
if raceEnabled {
|
|
iters /= 10
|
|
}
|
|
return iters
|
|
}
|
|
|
|
func initRandomTargetTest(t *testing.T, os, arch string) (*Target, rand.Source, int) {
|
|
target := initTargetTest(t, os, arch)
|
|
return target, randSource(t), iterCount()
|
|
}
|
|
|
|
func initTest(t *testing.T) (*Target, rand.Source, int) {
|
|
return initRandomTargetTest(t, "linux", "amd64")
|
|
}
|
|
|
|
func testEachTarget(t *testing.T, fn func(t *testing.T, target *Target)) {
|
|
t.Parallel()
|
|
for _, target := range AllTargets() {
|
|
target := target
|
|
t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) {
|
|
t.Parallel()
|
|
fn(t, target)
|
|
})
|
|
}
|
|
}
|
|
|
|
func testEachTargetRandom(t *testing.T, fn func(t *testing.T, target *Target, rs rand.Source, iters int)) {
|
|
t.Parallel()
|
|
targets := AllTargets()
|
|
iters := iterCount()
|
|
iters /= len(targets)
|
|
if iters < 3 {
|
|
iters = 3
|
|
}
|
|
rs0 := randSource(t)
|
|
for _, target := range targets {
|
|
target := target
|
|
rs := rand.NewSource(rs0.Int63())
|
|
t.Run(fmt.Sprintf("%v/%v", target.OS, target.Arch), func(t *testing.T) {
|
|
t.Parallel()
|
|
fn(t, target, rs, iters)
|
|
})
|
|
}
|
|
}
|