1
2
3
4
5 package fuzz
6
7 import (
8 "fmt"
9 "math/bits"
10 )
11
12
13
14 func ResetCoverage() {
15 cov := coverage()
16 clear(cov)
17 }
18
19
20
21
22
23 func SnapshotCoverage() {
24 cov := coverage()
25 for i, b := range cov {
26 coverageSnapshot[i] = pow2Table[b]
27 }
28 }
29
30
31
32 func diffCoverage(base, snapshot []byte) []byte {
33 if len(base) != len(snapshot) {
34 panic(fmt.Sprintf("the number of coverage bits changed: before=%d, after=%d", len(base), len(snapshot)))
35 }
36 found := false
37 for i := range snapshot {
38 if snapshot[i]&^base[i] != 0 {
39 found = true
40 break
41 }
42 }
43 if !found {
44 return nil
45 }
46 diff := make([]byte, len(snapshot))
47 for i := range diff {
48 diff[i] = snapshot[i] &^ base[i]
49 }
50 return diff
51 }
52
53
54
55 func countNewCoverageBits(base, snapshot []byte) int {
56 n := 0
57 for i := range snapshot {
58 n += bits.OnesCount8(snapshot[i] &^ base[i])
59 }
60 return n
61 }
62
63
64
65 func isCoverageSubset(base, snapshot []byte) bool {
66 for i, v := range base {
67 if v&snapshot[i] != v {
68 return false
69 }
70 }
71 return true
72 }
73
74
75
76 func hasCoverageBit(base, snapshot []byte) bool {
77 for i := range snapshot {
78 if snapshot[i]&base[i] != 0 {
79 return true
80 }
81 }
82 return false
83 }
84
85 func countBits(cov []byte) int {
86 n := 0
87 for _, c := range cov {
88 n += bits.OnesCount8(c)
89 }
90 return n
91 }
92
93 var (
94 coverageEnabled = len(coverage()) > 0
95 coverageSnapshot = make([]byte, len(coverage()))
96
97
98
99
100 _counters, _ecounters [0]byte
101
102
103 pow2Table [256]byte
104 )
105
106 func init() {
107 for i := range pow2Table {
108 b := byte(i)
109 b |= b >> 1
110 b |= b >> 2
111 b |= b >> 4
112 b -= b >> 1
113 pow2Table[i] = b
114 }
115 }
116
View as plain text