chunked_vector_fuzzer.cc
Go to the documentation of this file.
1 // Copyright 2021 gRPC authors.
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 #include <vector>
16 
19 #include "src/libfuzzer/libfuzzer_macro.h"
20 #include "test/core/gprpp/chunked_vector_fuzzer.pb.h"
21 
22 bool squelch = true;
23 bool leak_check = true;
24 
26  grpc_core::ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator(
27  "test"));
28 
29 static constexpr size_t kChunkSize = 17;
30 using IntHdl = std::shared_ptr<int>;
31 
32 namespace grpc_core {
33 struct Comparison {
34  explicit Comparison(Arena* arena) : chunked(arena) {}
35 
37  std::vector<IntHdl> std;
38 
39  // Check that both chunked and std are equivalent.
40  void AssertOk() const {
41  GPR_ASSERT(std.size() == chunked.size());
42  auto it_chunked = chunked.cbegin();
43  auto it_std = std.cbegin();
44  while (it_std != std.cend()) {
45  GPR_ASSERT(**it_std == **it_chunked);
46  ++it_chunked;
47  ++it_std;
48  }
49  GPR_ASSERT(it_chunked == chunked.cend());
50  }
51 };
52 
53 class Fuzzer {
54  public:
55  Fuzzer() = default;
56  ~Fuzzer() = default;
57 
58  void Act(const chunked_vector_fuzzer::Action& action) {
59  switch (action.action_type_case()) {
60  case chunked_vector_fuzzer::Action::kEmplaceBack: {
61  // Add some value to the back of a comparison, assert that both vectors
62  // are equivalent.
63  auto* c = Mutate(action.emplace_back().vector());
64  c->chunked.EmplaceBack(
65  std::make_shared<int>(action.emplace_back().value()));
66  c->std.emplace_back(
67  std::make_shared<int>(action.emplace_back().value()));
68  c->AssertOk();
69  } break;
70  case chunked_vector_fuzzer::Action::kPopBack: {
71  // Remove some value to the back of a comparison, assert that both
72  // vectors are equivalent.
73  auto* c = Mutate(action.pop_back().vector());
74  if (!c->chunked.empty()) {
75  c->chunked.PopBack();
76  c->std.pop_back();
77  c->AssertOk();
78  }
79  } break;
80  case chunked_vector_fuzzer::Action::kCopy: {
81  // Copy one vector into another, assert both everything stays
82  // equivalent.
83  auto it_from = vectors_.find(action.copy().from());
84  if (it_from == vectors_.end()) {
85  it_from =
86  vectors_.emplace(action.copy().from(), Comparison(arena_.get()))
87  .first;
88  }
89  auto it_to = vectors_.find(action.copy().to());
90  if (it_to == vectors_.end()) {
91  it_to = vectors_.emplace(action.copy().to(), it_from->second).first;
92  } else {
93  it_to->second = it_from->second;
94  }
95  it_from->second.AssertOk();
96  it_to->second.AssertOk();
97  } break;
98  case chunked_vector_fuzzer::Action::kMove: {
99  // Move one vector into another, assert both everything stays
100  // equivalent.
101  auto it_from = vectors_.find(action.move().from());
102  if (it_from == vectors_.end()) {
103  it_from =
104  vectors_.emplace(action.move().from(), Comparison(arena_.get()))
105  .first;
106  }
107  auto it_to = vectors_.find(action.move().to());
108  if (it_to == vectors_.end()) {
109  it_to =
110  vectors_.emplace(action.move().to(), std::move(it_from->second))
111  .first;
112  } else {
113  it_to->second = it_from->second;
114  }
115  it_from->second.AssertOk();
116  it_to->second.AssertOk();
117  } break;
118  case chunked_vector_fuzzer::Action::kClear: {
119  // Clear a vector, assert that both underlying vectors are equivalent.
120  auto* c = Mutate(action.clear().vector());
121  c->chunked.Clear();
122  c->std.clear();
123  c->AssertOk();
124  } break;
125  case chunked_vector_fuzzer::Action::kSwap: {
126  // Swap two vectors, assert that both underlying vectors are equivalent.
127  auto* from = Mutate(action.swap().from());
128  auto* to = Mutate(action.swap().to());
129  from->chunked.Swap(&to->chunked);
130  from->std.swap(to->std);
131  from->AssertOk();
132  } break;
133  case chunked_vector_fuzzer::Action::kRemoveIf: {
134  // Apply std::remove_if to a vector, assert that underlying vectors
135  // remain equivalent.
136  auto cond = [&](const IntHdl& hdl) {
137  return *hdl == action.remove_if().value();
138  };
139  auto* c = Mutate(action.remove_if().vector());
140  c->chunked.SetEnd(
141  std::remove_if(c->chunked.begin(), c->chunked.end(), cond));
142  c->std.erase(std::remove_if(c->std.begin(), c->std.end(), cond),
143  c->std.end());
144  c->AssertOk();
145  } break;
146  case chunked_vector_fuzzer::Action::ACTION_TYPE_NOT_SET:
147  break;
148  }
149  }
150 
151  private:
153  auto it = vectors_.find(index);
154  if (it != vectors_.end()) {
155  return &it->second;
156  }
157  return &vectors_.emplace(index, Comparison(arena_.get())).first->second;
158  }
159 
161  std::map<int, Comparison> vectors_;
162 };
163 } // namespace grpc_core
164 
165 DEFINE_PROTO_FUZZER(const chunked_vector_fuzzer::Msg& msg) {
167  for (int i = 0; i < msg.actions_size(); i++) {
168  fuzzer.Act(msg.actions(i));
169  }
170 }
grpc_core::MakeScopedArena
ScopedArenaPtr MakeScopedArena(size_t initial_size, MemoryAllocator *memory_allocator)
Definition: src/core/lib/resource_quota/arena.h:130
regen-readme.it
it
Definition: regen-readme.py:15
grpc_core::Comparison
Definition: chunked_vector_fuzzer.cc:33
grpc_event_engine::experimental::MemoryAllocator
Definition: memory_allocator.h:35
g_memory_allocator
static auto * g_memory_allocator
Definition: chunked_vector_fuzzer.cc:25
fuzzer
Fuzzer * fuzzer
Definition: promise_fuzzer.cc:124
grpc_core::ChunkedVector::cbegin
ConstForwardIterator cbegin() const
Definition: chunked_vector.h:204
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::Fuzzer::vectors_
std::map< int, Comparison > vectors_
Definition: chunked_vector_fuzzer.cc:161
grpc_core::Fuzzer::Fuzzer
Fuzzer()
Definition: avl_fuzzer.cc:26
kChunkSize
static constexpr size_t kChunkSize
Definition: chunked_vector_fuzzer.cc:29
to
size_t to
Definition: abseil-cpp/absl/container/internal/layout_test.cc:1385
grpc_core::Fuzzer::Act
void Act(const chunked_vector_fuzzer::Action &action)
Definition: chunked_vector_fuzzer.cc:58
DEFINE_PROTO_FUZZER
DEFINE_PROTO_FUZZER(const chunked_vector_fuzzer::Msg &msg)
Definition: chunked_vector_fuzzer.cc:165
grpc_core::Arena
Definition: src/core/lib/resource_quota/arena.h:45
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
grpc_core::ScopedArenaPtr
std::unique_ptr< Arena, ScopedArenaDeleter > ScopedArenaPtr
Definition: src/core/lib/resource_quota/arena.h:129
leak_check
bool leak_check
Definition: chunked_vector_fuzzer.cc:23
from
size_t from
Definition: abseil-cpp/absl/container/internal/layout_test.cc:1384
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_core::Fuzzer::~Fuzzer
~Fuzzer()
Definition: avl_fuzzer.cc:27
cond
static uv_cond_t cond
Definition: threadpool.c:33
IntHdl
std::shared_ptr< int > IntHdl
Definition: chunked_vector_fuzzer.cc:30
grpc_core::g_memory_allocator
static auto * g_memory_allocator
Definition: call_finalization_test.cc:24
grpc_core::ResourceQuota::Default
static ResourceQuotaRefPtr Default()
Definition: resource_quota.cc:27
grpc_core::ChunkedVector< IntHdl, kChunkSize >
resource_quota.h
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
chunked_vector.h
grpc_core::Fuzzer
Definition: avl_fuzzer.cc:24
client.action
action
Definition: examples/python/xds/client.py:49
grpc_core::Fuzzer::Mutate
Comparison * Mutate(int index)
Definition: chunked_vector_fuzzer.cc:152
grpc_core::IntHdl
std::shared_ptr< int > IntHdl
Definition: promise_fuzzer.cc:46
index
int index
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1184
squelch
bool squelch
Definition: chunked_vector_fuzzer.cc:22
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_core::Fuzzer::arena_
ScopedArenaPtr arena_
Definition: chunked_vector_fuzzer.cc:160
grpc_core::Comparison::std
std::vector< IntHdl > std
Definition: chunked_vector_fuzzer.cc:37
grpc_core::Comparison::chunked
ChunkedVector< IntHdl, kChunkSize > chunked
Definition: chunked_vector_fuzzer.cc:36
grpc_core::Comparison::AssertOk
void AssertOk() const
Definition: chunked_vector_fuzzer.cc:40
grpc_core::ChunkedVector::cend
ConstForwardIterator cend() const
Definition: chunked_vector.h:205
grpc_core::ChunkedVector::size
size_t size() const
Definition: chunked_vector.h:208
grpc_core::Comparison::Comparison
Comparison(Arena *arena)
Definition: chunked_vector_fuzzer.cc:34
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:45