To clarify if I was unclear above, this non-determinism doesn’t show up in what hits the disk (as it’s a k-v store), only in the MemTable which depends on the order that we write to it.
0diff --git a/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t1.a.txt b/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t1.b.txt
1index 8389ec5527..68708cc9fc 100644
2--- a/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t1.a.txt
3+++ b/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t1.b.txt
4@@ -61402,15 +61402,15 @@
5 45| 0| return "leveldb.InternalKeyComparator";
6 46| 0|}
7 47| |
8- 48| 6.11k|int InternalKeyComparator::Compare(const Slice& akey, const Slice& bkey) const {
9+ 48| 6.01k|int InternalKeyComparator::Compare(const Slice& akey, const Slice& bkey) const {
10 49| | // Order by:
11 50| | // increasing user key (according to user-supplied comparator)
12 51| | // decreasing sequence number
13 52| | // decreasing type (though sequence# should be enough to disambiguate)
14- 53| 6.11k| int r = user_comparator_->Compare(ExtractUserKey(akey), ExtractUserKey(bkey));
15- 54| 6.11k| if (r == 0) {
16+ 53| 6.01k| int r = user_comparator_->Compare(ExtractUserKey(akey), ExtractUserKey(bkey));
17+ 54| 6.01k| if (r == 0) {
18 ------------------
19- | Branch (54:7): [True: 61, False: 6.05k]
20+ | Branch (54:7): [True: 61, False: 5.95k]
21 ------------------
22 55| 61| const uint64_t anum = DecodeFixed64(akey.data() + akey.size() - 8);
23 56| 61| const uint64_t bnum = DecodeFixed64(bkey.data() + bkey.size() - 8);
24@@ -61426,8 +61426,8 @@
25 60| 51| r = +1;
26 61| 51| }
27 62| 61| }
28- 63| 6.11k| return r;
29- 64| 6.11k|}
30+ 63| 6.01k| return r;
31+ 64| 6.01k|}
32 65| |
33 66| |void InternalKeyComparator::FindShortestSeparator(std::string* start,
34 67| 10| const Slice& limit) const {
35@@ -61620,10 +61620,10 @@
36 92| |bool ParseInternalKey(const Slice& internal_key, ParsedInternalKey* result);
37 93| |
38 94| |// Returns the user key portion of an internal key.
39- 95| 13.1k|inline Slice ExtractUserKey(const Slice& internal_key) {
40- 96| 13.1k| assert(internal_key.size() >= 8);
41- 97| 13.1k| return Slice(internal_key.data(), internal_key.size() - 8);
42- 98| 13.1k|}
43+ 95| 12.9k|inline Slice ExtractUserKey(const Slice& internal_key) {
44+ 96| 12.9k| assert(internal_key.size() >= 8);
45+ 97| 12.9k| return Slice(internal_key.data(), internal_key.size() - 8);
46+ 98| 12.9k|}
47 99| |
48 100| |// A comparator for internal keys that uses a specified comparator for
49 101| |// the user key portion and breaks ties by decreasing sequence number.
50@@ -62498,12 +62498,12 @@
51 11| |
52 12| |namespace leveldb {
53 13| |
54- 14| 11.1k|static Slice GetLengthPrefixedSlice(const char* data) {
55- 15| 11.1k| uint32_t len;
56- 16| 11.1k| const char* p = data;
57- 17| 11.1k| p = GetVarint32Ptr(p, p + 5, &len); // +5: we assume "p" is not corrupted
58- 18| 11.1k| return Slice(p, len);
59- 19| 11.1k|}
60+ 14| 10.9k|static Slice GetLengthPrefixedSlice(const char* data) {
61+ 15| 10.9k| uint32_t len;
62+ 16| 10.9k| const char* p = data;
63+ 17| 10.9k| p = GetVarint32Ptr(p, p + 5, &len); // +5: we assume "p" is not corrupted
64+ 18| 10.9k| return Slice(p, len);
65+ 19| 10.9k|}
66 20| |
67 21| |MemTable::MemTable(const InternalKeyComparator& comparator)
68 22| 4| : comparator_(comparator), refs_(0), table_(comparator_, &arena_) {}
69@@ -62513,12 +62513,12 @@
70 26| 5|size_t MemTable::ApproximateMemoryUsage() { return arena_.MemoryUsage(); }
71 27| |
72 28| |int MemTable::KeyComparator::operator()(const char* aptr,
73- 29| 4.93k| const char* bptr) const {
74+ 29| 4.83k| const char* bptr) const {
75 30| | // Internal keys are encoded as length-prefixed strings.
76- 31| 4.93k| Slice a = GetLengthPrefixedSlice(aptr);
77- 32| 4.93k| Slice b = GetLengthPrefixedSlice(bptr);
78- 33| 4.93k| return comparator.Compare(a, b);
79- 34| 4.93k|}
80+ 31| 4.83k| Slice a = GetLengthPrefixedSlice(aptr);
81+ 32| 4.83k| Slice b = GetLengthPrefixedSlice(bptr);
82+ 33| 4.83k| return comparator.Compare(a, b);
83+ 34| 4.83k|}
84 35| |
85 36| |// Encode a suitable internal key target for "target" and return it.
86 37| |// Uses *scratch as scratch space, and the returned pointer will point
87@@ -62883,12 +62883,12 @@
88 150| |
89 151| | // Accessors/mutators for links. Wrapped in methods so we can
90 152| | // add the appropriate barriers as necessary.
91- 153| 5.55k| Node* Next(int n) {
92- 154| 5.55k| assert(n >= 0);
93+ 153| 5.24k| Node* Next(int n) {
94+ 154| 5.24k| assert(n >= 0);
95 155| | // Use an 'acquire load' so that we observe a fully initialized
96 156| | // version of the returned Node.
97- 157| 5.55k| return next_[n].load(std::memory_order_acquire);
98- 158| 5.55k| }
99+ 157| 5.24k| return next_[n].load(std::memory_order_acquire);
100+ 158| 5.24k| }
101 159| 587| void SetNext(int n, Node* x) {
102 160| 587| assert(n >= 0);
103 161| | // Use a 'release store' so that anybody who reads through this
104@@ -62995,15 +62995,15 @@
105 252| 414|}
106 253| |
107 254| |template <typename Key, class Comparator>
108- 255| 5.13k|bool SkipList<Key, Comparator>::KeyIsAfterNode(const Key& key, Node* n) const {
109+ 255| 4.82k|bool SkipList<Key, Comparator>::KeyIsAfterNode(const Key& key, Node* n) const {
110 256| | // null n is considered infinite
111- 257| 5.13k| return (n != nullptr) && (compare_(n->key, key) < 0);
112- ^4.52k
113+ 257| 4.82k| return (n != nullptr) && (compare_(n->key, key) < 0);
114+ ^4.42k
115 ------------------
116- | Branch (257:10): [True: 4.52k, False: 613]
117- | Branch (257:28): [True: 3.25k, False: 1.26k]
118+ | Branch (257:10): [True: 4.42k, False: 403]
119+ | Branch (257:28): [True: 2.94k, False: 1.47k]
120 ------------------
121- 258| 5.13k|}
122+ 258| 4.82k|}
123 259| |
124 260| |template <typename Key, class Comparator>
125 261| |typename SkipList<Key, Comparator>::Node*
126@@ -63011,18 +63011,18 @@
127 263| 443| Node** prev) const {
128 264| 443| Node* x = head_;
129 265| 443| int level = GetMaxHeight() - 1;
130- 266| 5.13k| while (true) {
131+ 266| 4.82k| while (true) {
132 ------------------
133 | Branch (266:10): [Folded - Ignored]
134 ------------------
135- 267| 5.13k| Node* next = x->Next(level);
136- 268| 5.13k| if (KeyIsAfterNode(key, next)) {
137+ 267| 4.82k| Node* next = x->Next(level);
138+ 268| 4.82k| if (KeyIsAfterNode(key, next)) {
139 ------------------
140- | Branch (268:9): [True: 3.25k, False: 1.87k]
141+ | Branch (268:9): [True: 2.94k, False: 1.87k]
142 ------------------
143 269| | // Keep searching in this list
144- 270| 3.25k| x = next;
145- 271| 3.25k| } else {
146+ 270| 2.94k| x = next;
147+ 271| 2.94k| } else {
148 272| 1.87k| if (prev != nullptr) prev[level] = x;
149 ^1.85k
150 ------------------
151@@ -63038,7 +63038,7 @@
152 277| 1.43k| level--;
153 278| 1.43k| }
154 279| 1.87k| }
155- 280| 5.13k| }
156+ 280| 4.82k| }
157 281| 443|}
158 282| |
159 283| |template <typename Key, class Comparator>
160@@ -68240,7 +68240,7 @@
161 31| 945| Slice() : data_(""), size_(0) {}
162 32| |
163 33| | // Create a slice that refers to d[0,n-1].
164- 34| 27.6k| Slice(const char* d, size_t n) : data_(d), size_(n) {}
165+ 34| 27.2k| Slice(const char* d, size_t n) : data_(d), size_(n) {}
166 35| |
167 36| | // Create a slice that refers to the contents of "s"
168 37| 2.16k| Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}
169@@ -68253,10 +68253,10 @@
170 44| | Slice& operator=(const Slice&) = default;
171 45| |
172 46| | // Return a pointer to the beginning of the referenced data
173- 47| 22.1k| const char* data() const { return data_; }
174+ 47| 21.9k| const char* data() const { return data_; }
175 48| |
176 49| | // Return the length (in bytes) of the referenced data
177- 50| 40.5k| size_t size() const { return size_; }
178+ 50| 40.1k| size_t size() const { return size_; }
179 51| |
180 52| | // Return true iff the length of the referenced data is zero
181 53| 433| bool empty() const { return size_ == 0; }
182@@ -68322,16 +68322,16 @@
183 101| |
184 102| 26|inline bool operator!=(const Slice& x, const Slice& y) { return !(x == y); }
185 103| |
186- 104| 6.41k|inline int Slice::compare(const Slice& b) const {
187- 105| 6.41k| const size_t min_len = (size_ < b.size_) ? size_ : b.size_;
188- ^227 ^6.19k
189+ 104| 6.31k|inline int Slice::compare(const Slice& b) const {
190+ 105| 6.31k| const size_t min_len = (size_ < b.size_) ? size_ : b.size_;
191+ ^227 ^6.09k
192 ------------------
193- | Branch (105:26): [True: 227, False: 6.19k]
194+ | Branch (105:26): [True: 227, False: 6.09k]
195 ------------------
196- 106| 6.41k| int r = memcmp(data_, b.data_, min_len);
197- 107| 6.41k| if (r == 0) {
198+ 106| 6.31k| int r = memcmp(data_, b.data_, min_len);
199+ 107| 6.31k| if (r == 0) {
200 ------------------
201- | Branch (107:7): [True: 89, False: 6.32k]
202+ | Branch (107:7): [True: 89, False: 6.22k]
203 ------------------
204 108| 89| if (size_ < b.size_)
205 ------------------
206@@ -68344,8 +68344,8 @@
207 ------------------
208 111| 0| r = +1;
209 112| 89| }
210- 113| 6.41k| return r;
211- 114| 6.41k|}
212+ 113| 6.31k| return r;
213+ 114| 6.31k|}
214 115| |
215 116| |} // namespace leveldb
216 117| |
217@@ -72351,22 +72351,22 @@
218 106| |const char* GetVarint32PtrFallback(const char* p, const char* limit,
219 107| | uint32_t* value);
220 108| |inline const char* GetVarint32Ptr(const char* p, const char* limit,
221- 109| 11.9k| uint32_t* value) {
222- 110| 11.9k| if (p < limit) {
223+ 109| 11.7k| uint32_t* value) {
224+ 110| 11.7k| if (p < limit) {
225 ------------------
226- | Branch (110:7): [True: 11.9k, False: 4]
227+ | Branch (110:7): [True: 11.7k, False: 4]
228 ------------------
229- 111| 11.9k| uint32_t result = *(reinterpret_cast<const uint8_t*>(p));
230- 112| 11.9k| if ((result & 128) == 0) {
231+ 111| 11.7k| uint32_t result = *(reinterpret_cast<const uint8_t*>(p));
232diff --git a/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t0.a.txt b/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t0.b.txt
233index 209490c47e..67c0258d57 100644
234+ 112| 11.7k| if ((result & 128) == 0) {
235 ------------------
236- | Branch (112:9): [True: 11.9k, False: 0]
237--- a/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t0.a.txt
238+ | Branch (112:9): [True: 11.7k, False: 0]
239+++ b/Users/eugenesiegel/btc/bitcoin/build_fuzzcov/fuzz_det_cov.show.t0.b.txt
240 ------------------
241- 113| 11.9k| *value = result;
242- 114| 11.9k| return p + 1;
243- 115| 11.9k| }
244- 116| 11.9k| }
245@@ -61393,15 +61393,15 @@
246+ 113| 11.7k| *value = result;
247+ 114| 11.7k| return p + 1;
248 45| 0| return "leveldb.InternalKeyComparator";
249+ 115| 11.7k| }
250 46| 0|}
251+ 116| 11.7k| }
252 47| |
253 117| 4| return GetVarint32PtrFallback(p, limit, value);
254- 118| 11.9k|}
255+ 118| 11.7k|}
256- 48| 6.06k|int InternalKeyComparator::Compare(const Slice& akey, const Slice& bkey) const {
257 119| |
258 120| |} // namespace leveldb
259 121| |
260+ 48| 6.01k|int InternalKeyComparator::Compare(const Slice& akey, const Slice& bkey) const {
261@@ -72399,9 +72399,9 @@
262 24| |
263 25| 4| const char* Name() const override { return "leveldb.BytewiseComparator"; }
264 26| |
265 49| | // Order by:
266- 27| 6.41k| int Compare(const Slice& a, const Slice& b) const override {
267 50| | // increasing user key (according to user-supplied comparator)
268- 28| 6.41k| return a.compare(b);
269 51| | // decreasing sequence number
270- 29| 6.41k| }
271 52| | // decreasing type (though sequence# should be enough to disambiguate)
272+ 27| 6.31k| int Compare(const Slice& a, const Slice& b) const override {
273- 53| 6.06k| int r = user_comparator_->Compare(ExtractUserKey(akey), ExtractUserKey(bkey));
274+ 28| 6.31k| return a.compare(b);
275- 54| 6.06k| if (r == 0) {
276+ 29| 6.31k| }
277+ 53| 6.01k| int r = user_comparator_->Compare(ExtractUserKey(akey), ExtractUserKey(bkey));
278 30| |
279+ 54| 6.01k| if (r == 0) {
280 31| | void FindShortestSeparator(std::string* start,
281 ------------------
282 32| 10| const Slice& limit) const override {
283- | Branch (54:7): [True: 66, False: 5.99k]
284+ | Branch (54:7): [True: 66, False: 5.94k]
285 ------------------
286 55| 66| const uint64_t anum = DecodeFixed64(akey.data() + akey.size() - 8);
287 56| 66| const uint64_t bnum = DecodeFixed64(bkey.data() + bkey.size() - 8);
288@@ -61417,8 +61417,8 @@
289 60| 56| r = +1;
290 61| 56| }
291 62| 66| }
292- 63| 6.06k| return r;
293- 64| 6.06k|}
294+ 63| 6.01k| return r;
295+ 64| 6.01k|}
296 65| |
297 66| |void InternalKeyComparator::FindShortestSeparator(std::string* start,
298 67| 10| const Slice& limit) const {
299@@ -61611,10 +61611,10 @@
300 92| |bool ParseInternalKey(const Slice& internal_key, ParsedInternalKey* result);
301 93| |
302 94| |// Returns the user key portion of an internal key.
303- 95| 13.0k|inline Slice ExtractUserKey(const Slice& internal_key) {
304- 96| 13.0k| assert(internal_key.size() >= 8);
305- 97| 13.0k| return Slice(internal_key.data(), internal_key.size() - 8);
306- 98| 13.0k|}
307+ 95| 12.9k|inline Slice ExtractUserKey(const Slice& internal_key) {
308+ 96| 12.9k| assert(internal_key.size() >= 8);
309+ 97| 12.9k| return Slice(internal_key.data(), internal_key.size() - 8);
310+ 98| 12.9k|}
311 99| |
312 100| |// A comparator for internal keys that uses a specified comparator for
313 101| |// the user key portion and breaks ties by decreasing sequence number.
314@@ -62489,12 +62489,12 @@
315 11| |
316 12| |namespace leveldb {
317 13| |
318- 14| 10.9k|static Slice GetLengthPrefixedSlice(const char* data) {
319- 15| 10.9k| uint32_t len;
320- 16| 10.9k| const char* p = data;
321- 17| 10.9k| p = GetVarint32Ptr(p, p + 5, &len); // +5: we assume "p" is not corrupted
322- 18| 10.9k| return Slice(p, len);
323- 19| 10.9k|}
324+ 14| 10.8k|static Slice GetLengthPrefixedSlice(const char* data) {
325+ 15| 10.8k| uint32_t len;
326+ 16| 10.8k| const char* p = data;
327+ 17| 10.8k| p = GetVarint32Ptr(p, p + 5, &len); // +5: we assume "p" is not corrupted
328+ 18| 10.8k| return Slice(p, len);
329+ 19| 10.8k|}
330 20| |
331 21| |MemTable::MemTable(const InternalKeyComparator& comparator)
332 22| 4| : comparator_(comparator), refs_(0), table_(comparator_, &arena_) {}
333@@ -62504,12 +62504,12 @@
334 26| 5|size_t MemTable::ApproximateMemoryUsage() { return arena_.MemoryUsage(); }
335 27| |
336 28| |int MemTable::KeyComparator::operator()(const char* aptr,
337- 29| 4.83k| const char* bptr) const {
338+ 29| 4.78k| const char* bptr) const {
339 30| | // Internal keys are encoded as length-prefixed strings.
340- 31| 4.83k| Slice a = GetLengthPrefixedSlice(aptr);
341- 32| 4.83k| Slice b = GetLengthPrefixedSlice(bptr);
342- 33| 4.83k| return comparator.Compare(a, b);
343- 34| 4.83k|}
344+ 31| 4.78k| Slice a = GetLengthPrefixedSlice(aptr);
345+ 32| 4.78k| Slice b = GetLengthPrefixedSlice(bptr);
346+ 33| 4.78k| return comparator.Compare(a, b);
347+ 34| 4.78k|}
348 35| |
349 36| |// Encode a suitable internal key target for "target" and return it.
350 37| |// Uses *scratch as scratch space, and the returned pointer will point
351@@ -62874,12 +62874,12 @@
352 150| |
353 151| | // Accessors/mutators for links. Wrapped in methods so we can
354 152| | // add the appropriate barriers as necessary.
355- 153| 5.37k| Node* Next(int n) {
356- 154| 5.37k| assert(n >= 0);
357+ 153| 5.14k| Node* Next(int n) {
358+ 154| 5.14k| assert(n >= 0);
359 155| | // Use an 'acquire load' so that we observe a fully initialized
360 156| | // version of the returned Node.
361- 157| 5.37k| return next_[n].load(std::memory_order_acquire);
362- 158| 5.37k| }
363+ 157| 5.14k| return next_[n].load(std::memory_order_acquire);
364+ 158| 5.14k| }
365 159| 587| void SetNext(int n, Node* x) {
366 160| 587| assert(n >= 0);
367 161| | // Use a 'release store' so that anybody who reads through this
368@@ -62986,15 +62986,15 @@
369 252| 414|}
370 253| |
371 254| |template <typename Key, class Comparator>
372- 255| 4.95k|bool SkipList<Key, Comparator>::KeyIsAfterNode(const Key& key, Node* n) const {
373+ 255| 4.73k|bool SkipList<Key, Comparator>::KeyIsAfterNode(const Key& key, Node* n) const {
374 256| | // null n is considered infinite
375- 257| 4.95k| return (n != nullptr) && (compare_(n->key, key) < 0);
376- ^4.42k
377+ 257| 4.73k| return (n != nullptr) && (compare_(n->key, key) < 0);
378+ ^4.37k
379 ------------------
380- | Branch (257:10): [True: 4.42k, False: 534]
381- | Branch (257:28): [True: 3.07k, False: 1.35k]
382+ | Branch (257:10): [True: 4.37k, False: 356]
383+ | Branch (257:28): [True: 2.84k, False: 1.52k]
384 ------------------
385- 258| 4.95k|}
386+ 258| 4.73k|}
387 259| |
388 260| |template <typename Key, class Comparator>
389 261| |typename SkipList<Key, Comparator>::Node*
390@@ -63002,18 +63002,18 @@
391 263| 448| Node** prev) const {
392 264| 448| Node* x = head_;
393 265| 448| int level = GetMaxHeight() - 1;
394- 266| 4.95k| while (true) {
395+ 266| 4.73k| while (true) {
396 ------------------
397 | Branch (266:10): [Folded - Ignored]
398 ------------------
399- 267| 4.95k| Node* next = x->Next(level);
400- 268| 4.95k| if (KeyIsAfterNode(key, next)) {
401+ 267| 4.73k| Node* next = x->Next(level);
402+ 268| 4.73k| if (KeyIsAfterNode(key, next)) {
403 ------------------
404- | Branch (268:9): [True: 3.07k, False: 1.88k]
405+ | Branch (268:9): [True: 2.84k, False: 1.88k]
406 ------------------
407 269| | // Keep searching in this list
408- 270| 3.07k| x = next;
409- 271| 3.07k| } else {
410+ 270| 2.84k| x = next;
411+ 271| 2.84k| } else {
412 272| 1.88k| if (prev != nullptr) prev[level] = x;
413 ^1.85k
414 ------------------
415@@ -63029,7 +63029,7 @@
416 277| 1.43k| level--;
417 278| 1.43k| }
418 279| 1.88k| }
419- 280| 4.95k| }
420+ 280| 4.73k| }
421 281| 448|}
422 282| |
423 283| |template <typename Key, class Comparator>
424@@ -68231,7 +68231,7 @@
425 31| 985| Slice() : data_(""), size_(0) {}
426 32| |
427 33| | // Create a slice that refers to d[0,n-1].
428- 34| 27.4k| Slice(const char* d, size_t n) : data_(d), size_(n) {}
429+ 34| 27.2k| Slice(const char* d, size_t n) : data_(d), size_(n) {}
430 35| |
431 36| | // Create a slice that refers to the contents of "s"
432 37| 2.20k| Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}
433@@ -68244,10 +68244,10 @@
434 44| | Slice& operator=(const Slice&) = default;
435 45| |
436 46| | // Return a pointer to the beginning of the referenced data
437- 47| 22.1k| const char* data() const { return data_; }
438+ 47| 22.0k| const char* data() const { return data_; }
439 48| |
440 49| | // Return the length (in bytes) of the referenced data
441- 50| 40.4k| size_t size() const { return size_; }
442+ 50| 40.2k| size_t size() const { return size_; }
443 51| |
444 52| | // Return true iff the length of the referenced data is zero
445 53| 433| bool empty() const { return size_ == 0; }
446@@ -68313,16 +68313,16 @@
447 101| |
448 102| 31|inline bool operator!=(const Slice& x, const Slice& y) { return !(x == y); }
449 103| |
450- 104| 6.37k|inline int Slice::compare(const Slice& b) const {
451- 105| 6.37k| const size_t min_len = (size_ < b.size_) ? size_ : b.size_;
452- ^250 ^6.12k
453+ 104| 6.32k|inline int Slice::compare(const Slice& b) const {
454+ 105| 6.32k| const size_t min_len = (size_ < b.size_) ? size_ : b.size_;
455+ ^239 ^6.08k
456 ------------------
457- | Branch (105:26): [True: 250, False: 6.12k]
458+ | Branch (105:26): [True: 239, False: 6.08k]
459 ------------------
460- 106| 6.37k| int r = memcmp(data_, b.data_, min_len);
461- 107| 6.37k| if (r == 0) {
462+ 106| 6.32k| int r = memcmp(data_, b.data_, min_len);
463+ 107| 6.32k| if (r == 0) {
464 ------------------
465- | Branch (107:7): [True: 99, False: 6.27k]
466+ | Branch (107:7): [True: 99, False: 6.22k]
467 ------------------
468 108| 99| if (size_ < b.size_)
469 ------------------
470@@ -68335,8 +68335,8 @@
471 ------------------
472 111| 0| r = +1;
473 112| 99| }
474- 113| 6.37k| return r;
475- 114| 6.37k|}
476+ 113| 6.32k| return r;
477+ 114| 6.32k|}
478 115| |
479 116| |} // namespace leveldb
480 117| |
481@@ -71306,15 +71306,15 @@
482 45| 418| char* result;
483 46| 418| if (needed <= alloc_bytes_remaining_) {
484 ------------------
485- | Branch (46:7): [True: 411, False: 7]
486+ | Branch (46:7): [True: 412, False: 6]
487 ------------------
488- 47| 411| result = alloc_ptr_ + slop;
489- 48| 411| alloc_ptr_ += needed;
490- 49| 411| alloc_bytes_remaining_ -= needed;
491- 50| 411| } else {
492+ 47| 412| result = alloc_ptr_ + slop;
493+ 48| 412| alloc_ptr_ += needed;
494+ 49| 412| alloc_bytes_remaining_ -= needed;
495+ 50| 412| } else {
496 51| | // AllocateFallback always returned aligned memory
497- 52| 7| result = AllocateFallback(bytes);
498- 53| 7| }
499+ 52| 6| result = AllocateFallback(bytes);
500+ 53| 6| }
501 54| 418| assert((reinterpret_cast<uintptr_t>(result) & (align - 1)) == 0);
502 55| 418| return result;
503 56| 418|}
504@@ -71391,14 +71391,14 @@
505 59| 414| assert(bytes > 0);
506 60| 414| if (bytes <= alloc_bytes_remaining_) {
507 ------------------
508- | Branch (60:7): [True: 405, False: 9]
509+ | Branch (60:7): [True: 404, False: 10]
510 ------------------
511- 61| 405| char* result = alloc_ptr_;
512- 62| 405| alloc_ptr_ += bytes;
513- 63| 405| alloc_bytes_remaining_ -= bytes;
514- 64| 405| return result;
515- 65| 405| }
516- 66| 9| return AllocateFallback(bytes);
517+ 61| 404| char* result = alloc_ptr_;
518+ 62| 404| alloc_ptr_ += bytes;
519+ 63| 404| alloc_bytes_remaining_ -= bytes;
520+ 64| 404| return result;
521+ 65| 404| }
522+ 66| 10| return AllocateFallback(bytes);
523 67| 414|}
524 68| |
525 69| |} // namespace leveldb
526@@ -72342,22 +72342,22 @@
527 106| |const char* GetVarint32PtrFallback(const char* p, const char* limit,
528 107| | uint32_t* value);
529 108| |inline const char* GetVarint32Ptr(const char* p, const char* limit,
530- 109| 11.7k| uint32_t* value) {
531- 110| 11.7k| if (p < limit) {
532+ 109| 11.6k| uint32_t* value) {
533+ 110| 11.6k| if (p < limit) {
534 ------------------
535- | Branch (110:7): [True: 11.7k, False: 4]
536+ | Branch (110:7): [True: 11.6k, False: 4]
537 ------------------
538- 111| 11.7k| uint32_t result = *(reinterpret_cast<const uint8_t*>(p));
539- 112| 11.7k| if ((result & 128) == 0) {
540+ 111| 11.6k| uint32_t result = *(reinterpret_cast<const uint8_t*>(p));
541+ 112| 11.6k| if ((result & 128) == 0) {
542 ------------------
543- | Branch (112:9): [True: 11.7k, False: 0]
544+ | Branch (112:9): [True: 11.6k, False: 0]
545 ------------------
546- 113| 11.7k| *value = result;
547- 114| 11.7k| return p + 1;
548- 115| 11.7k| }
549- 116| 11.7k| }
550+ 113| 11.6k| *value = result;
551+ 114| 11.6k| return p + 1;
552+ 115| 11.6k| }
553+ 116| 11.6k| }
554 117| 4| return GetVarint32PtrFallback(p, limit, value);
555- 118| 11.7k|}
556+ 118| 11.6k|}
557 119| |
558 120| |} // namespace leveldb
559 121| |
560@@ -72390,9 +72390,9 @@
561 24| |
562 25| 4| const char* Name() const override { return "leveldb.BytewiseComparator"; }
563 26| |
564- 27| 6.36k| int Compare(const Slice& a, const Slice& b) const override {
565- 28| 6.36k| return a.compare(b);
566- 29| 6.36k| }
567+ 27| 6.32k| int Compare(const Slice& a, const Slice& b) const override {
568+ 28| 6.32k| return a.compare(b);
569+ 29| 6.32k| }
570 30| |
571 31| | void FindShortestSeparator(std::string* start,
572 32| 10| const Slice& limit) const override {
573⚠️
574
575The coverage was not deterministic between runs.
576The fuzz target input was /Users/eugenesiegel/btc/bitcoin/cmpctblock/cmpctblock/00095f04def2d4e203a2844032ee4bb88e33681d