• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021, The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #![allow(missing_docs)]
16 #![no_main]
17 #![feature(bench_black_box)]
18 
19 use hashlink::LinkedHashMap;
20 use libfuzzer_sys::arbitrary::Arbitrary;
21 use libfuzzer_sys::fuzz_target;
22 
23 const MAX_RESERVE: usize = 1024;
24 
25 #[derive(Arbitrary, Debug, Eq, Hash, PartialEq)]
26 enum Data {
27     A,
28     B,
29     Int { val: u8 },
30 }
31 
32 #[derive(Arbitrary, Debug)]
33 enum LinkedHashMapMethods {
34     Insert { key: Data, value: Data },
35     Remove { key: Data },
36     ContainsKey { key: Data },
37     Get { key: Data },
38     EntryOrInsert { key: Data, value: Data },
39     Iter,
40     Drain,
41     Clear,
42     Reserve { additional: usize },
43     ShrinkToFit,
44 }
45 
46 fuzz_target!(|commands: Vec<LinkedHashMapMethods>| {
47     let mut map = LinkedHashMap::new();
48     for command in commands {
49         match command {
50             LinkedHashMapMethods::Insert { key, value } => {
51                 map.insert(key, value);
52             }
53             LinkedHashMapMethods::Remove { key } => {
54                 map.remove(&key);
55             }
56             LinkedHashMapMethods::ContainsKey { key } => {
57                 map.contains_key(&key);
58             }
59             LinkedHashMapMethods::Get { key } => {
60                 map.get(&key);
61             }
62             LinkedHashMapMethods::EntryOrInsert { key, value } => {
63                 map.entry(key).or_insert(value);
64             }
65             LinkedHashMapMethods::Iter => {
66                 std::hint::black_box(map.iter().count());
67             }
68             LinkedHashMapMethods::Drain => {
69                 std::hint::black_box(map.drain().count());
70             }
71             LinkedHashMapMethods::Clear => {
72                 map.clear();
73             }
74             LinkedHashMapMethods::Reserve { additional } => {
75                 // Avoid allocating too much memory and crashing the fuzzer.
76                 map.reserve(additional % MAX_RESERVE);
77             }
78             LinkedHashMapMethods::ShrinkToFit => {
79                 map.shrink_to_fit();
80             }
81         }
82     }
83 });
84