OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <iostream> | 5 #include <iostream> |
6 #include <set> | 6 #include <set> |
7 #include <string> | 7 #include <string> |
| 8 #include <tuple> |
8 #include <utility> | 9 #include <utility> |
9 #include <vector> | 10 #include <vector> |
10 | 11 |
11 #include "base/macros.h" | 12 #include "base/macros.h" |
12 #include "base/memory/shared_memory_handle.h" | 13 #include "base/memory/shared_memory_handle.h" |
13 #include "base/strings/string_util.h" | 14 #include "base/strings/string_util.h" |
14 #include "build/build_config.h" | 15 #include "build/build_config.h" |
15 #include "ipc/ipc_message.h" | 16 #include "ipc/ipc_message.h" |
16 #include "ipc/ipc_message_utils.h" | 17 #include "ipc/ipc_message_utils.h" |
17 #include "ipc/ipc_switches.h" | 18 #include "ipc/ipc_switches.h" |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 template <> | 206 template <> |
206 struct FuzzTraits<base::string16> { | 207 struct FuzzTraits<base::string16> { |
207 static bool Fuzz(base::string16* p, Fuzzer* fuzzer) { | 208 static bool Fuzz(base::string16* p, Fuzzer* fuzzer) { |
208 fuzzer->FuzzString16(p); | 209 fuzzer->FuzzString16(p); |
209 return true; | 210 return true; |
210 } | 211 } |
211 }; | 212 }; |
212 | 213 |
213 // Specializations for tuples. | 214 // Specializations for tuples. |
214 template <> | 215 template <> |
215 struct FuzzTraits<base::Tuple<>> { | 216 struct FuzzTraits<std::tuple<>> { |
216 static bool Fuzz(base::Tuple<>* p, Fuzzer* fuzzer) { | 217 static bool Fuzz(std::tuple<>* p, Fuzzer* fuzzer) { return true; } |
217 return true; | |
218 } | |
219 }; | 218 }; |
220 | 219 |
221 template <class A> | 220 template <class A> |
222 struct FuzzTraits<base::Tuple<A>> { | 221 struct FuzzTraits<std::tuple<A>> { |
223 static bool Fuzz(base::Tuple<A>* p, Fuzzer* fuzzer) { | 222 static bool Fuzz(std::tuple<A>* p, Fuzzer* fuzzer) { |
224 return FuzzParam(&base::get<0>(*p), fuzzer); | 223 return FuzzParam(&std::get<0>(*p), fuzzer); |
225 } | 224 } |
226 }; | 225 }; |
227 | 226 |
228 template <class A, class B> | 227 template <class A, class B> |
229 struct FuzzTraits<base::Tuple<A, B>> { | 228 struct FuzzTraits<std::tuple<A, B>> { |
230 static bool Fuzz(base::Tuple<A, B>* p, Fuzzer* fuzzer) { | 229 static bool Fuzz(std::tuple<A, B>* p, Fuzzer* fuzzer) { |
231 return | 230 return FuzzParam(&std::get<0>(*p), fuzzer) && |
232 FuzzParam(&base::get<0>(*p), fuzzer) && | 231 FuzzParam(&std::get<1>(*p), fuzzer); |
233 FuzzParam(&base::get<1>(*p), fuzzer); | |
234 } | 232 } |
235 }; | 233 }; |
236 | 234 |
237 template <class A, class B, class C> | 235 template <class A, class B, class C> |
238 struct FuzzTraits<base::Tuple<A, B, C>> { | 236 struct FuzzTraits<std::tuple<A, B, C>> { |
239 static bool Fuzz(base::Tuple<A, B, C>* p, Fuzzer* fuzzer) { | 237 static bool Fuzz(std::tuple<A, B, C>* p, Fuzzer* fuzzer) { |
240 return | 238 return FuzzParam(&std::get<0>(*p), fuzzer) && |
241 FuzzParam(&base::get<0>(*p), fuzzer) && | 239 FuzzParam(&std::get<1>(*p), fuzzer) && |
242 FuzzParam(&base::get<1>(*p), fuzzer) && | 240 FuzzParam(&std::get<2>(*p), fuzzer); |
243 FuzzParam(&base::get<2>(*p), fuzzer); | |
244 } | 241 } |
245 }; | 242 }; |
246 | 243 |
247 template <class A, class B, class C, class D> | 244 template <class A, class B, class C, class D> |
248 struct FuzzTraits<base::Tuple<A, B, C, D>> { | 245 struct FuzzTraits<std::tuple<A, B, C, D>> { |
249 static bool Fuzz(base::Tuple<A, B, C, D>* p, Fuzzer* fuzzer) { | 246 static bool Fuzz(std::tuple<A, B, C, D>* p, Fuzzer* fuzzer) { |
250 return | 247 return FuzzParam(&std::get<0>(*p), fuzzer) && |
251 FuzzParam(&base::get<0>(*p), fuzzer) && | 248 FuzzParam(&std::get<1>(*p), fuzzer) && |
252 FuzzParam(&base::get<1>(*p), fuzzer) && | 249 FuzzParam(&std::get<2>(*p), fuzzer) && |
253 FuzzParam(&base::get<2>(*p), fuzzer) && | 250 FuzzParam(&std::get<3>(*p), fuzzer); |
254 FuzzParam(&base::get<3>(*p), fuzzer); | |
255 } | 251 } |
256 }; | 252 }; |
257 | 253 |
258 template <class A, class B, class C, class D, class E> | 254 template <class A, class B, class C, class D, class E> |
259 struct FuzzTraits<base::Tuple<A, B, C, D, E>> { | 255 struct FuzzTraits<std::tuple<A, B, C, D, E>> { |
260 static bool Fuzz(base::Tuple<A, B, C, D, E>* p, Fuzzer* fuzzer) { | 256 static bool Fuzz(std::tuple<A, B, C, D, E>* p, Fuzzer* fuzzer) { |
261 return | 257 return FuzzParam(&std::get<0>(*p), fuzzer) && |
262 FuzzParam(&base::get<0>(*p), fuzzer) && | 258 FuzzParam(&std::get<1>(*p), fuzzer) && |
263 FuzzParam(&base::get<1>(*p), fuzzer) && | 259 FuzzParam(&std::get<2>(*p), fuzzer) && |
264 FuzzParam(&base::get<2>(*p), fuzzer) && | 260 FuzzParam(&std::get<3>(*p), fuzzer) && |
265 FuzzParam(&base::get<3>(*p), fuzzer) && | 261 FuzzParam(&std::get<4>(*p), fuzzer); |
266 FuzzParam(&base::get<4>(*p), fuzzer); | |
267 } | 262 } |
268 }; | 263 }; |
269 | 264 |
270 // Specializations for containers. | 265 // Specializations for containers. |
271 template <class A> | 266 template <class A> |
272 struct FuzzTraits<std::vector<A> > { | 267 struct FuzzTraits<std::vector<A> > { |
273 static bool Fuzz(std::vector<A>* p, Fuzzer* fuzzer) { | 268 static bool Fuzz(std::vector<A>* p, Fuzzer* fuzzer) { |
274 ++g_depth; | 269 ++g_depth; |
275 size_t count = p->size(); | 270 size_t count = p->size(); |
276 if (fuzzer->ShouldGenerate()) { | 271 if (fuzzer->ShouldGenerate()) { |
(...skipping 1685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1962 template <typename... Args> | 1957 template <typename... Args> |
1963 static Message* New(const Args&... args) { | 1958 static Message* New(const Args&... args) { |
1964 return new Message(RandInRange(MAX_FAKE_ROUTING_ID), args...); | 1959 return new Message(RandInRange(MAX_FAKE_ROUTING_ID), args...); |
1965 } | 1960 } |
1966 }; | 1961 }; |
1967 | 1962 |
1968 template <typename Message> | 1963 template <typename Message> |
1969 class FuzzerHelper; | 1964 class FuzzerHelper; |
1970 | 1965 |
1971 template <typename Meta, typename... Ins> | 1966 template <typename Meta, typename... Ins> |
1972 class FuzzerHelper<IPC::MessageT<Meta, base::Tuple<Ins...>, void>> { | 1967 class FuzzerHelper<IPC::MessageT<Meta, std::tuple<Ins...>, void>> { |
1973 public: | 1968 public: |
1974 using Message = IPC::MessageT<Meta, base::Tuple<Ins...>, void>; | 1969 using Message = IPC::MessageT<Meta, std::tuple<Ins...>, void>; |
1975 | 1970 |
1976 static IPC::Message* Fuzz(IPC::Message* msg, Fuzzer* fuzzer) { | 1971 static IPC::Message* Fuzz(IPC::Message* msg, Fuzzer* fuzzer) { |
1977 return FuzzImpl(msg, fuzzer, base::MakeIndexSequence<sizeof...(Ins)>()); | 1972 return FuzzImpl(msg, fuzzer, base::MakeIndexSequence<sizeof...(Ins)>()); |
1978 } | 1973 } |
1979 | 1974 |
1980 private: | 1975 private: |
1981 template <size_t... Ns> | 1976 template <size_t... Ns> |
1982 static IPC::Message* FuzzImpl(IPC::Message* msg, | 1977 static IPC::Message* FuzzImpl(IPC::Message* msg, |
1983 Fuzzer* fuzzer, | 1978 Fuzzer* fuzzer, |
1984 base::IndexSequence<Ns...>) { | 1979 base::IndexSequence<Ns...>) { |
1985 typename Message::Param p; | 1980 typename Message::Param p; |
1986 if (msg) { | 1981 if (msg) { |
1987 Message::Read(static_cast<Message*>(msg), &p); | 1982 Message::Read(static_cast<Message*>(msg), &p); |
1988 } | 1983 } |
1989 if (FuzzParam(&p, fuzzer)) { | 1984 if (FuzzParam(&p, fuzzer)) { |
1990 return MessageFactory<Message, Meta::kKind>::New(base::get<Ns>(p)...); | 1985 return MessageFactory<Message, Meta::kKind>::New(std::get<Ns>(p)...); |
1991 } | 1986 } |
1992 std::cerr << "Don't know how to handle " << Meta::kName << "\n"; | 1987 std::cerr << "Don't know how to handle " << Meta::kName << "\n"; |
1993 return nullptr; | 1988 return nullptr; |
1994 } | 1989 } |
1995 }; | 1990 }; |
1996 | 1991 |
1997 template <typename Meta, typename... Ins, typename... Outs> | 1992 template <typename Meta, typename... Ins, typename... Outs> |
1998 class FuzzerHelper< | 1993 class FuzzerHelper< |
1999 IPC::MessageT<Meta, base::Tuple<Ins...>, base::Tuple<Outs...>>> { | 1994 IPC::MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>> { |
2000 public: | 1995 public: |
2001 using Message = | 1996 using Message = IPC::MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>; |
2002 IPC::MessageT<Meta, base::Tuple<Ins...>, base::Tuple<Outs...>>; | |
2003 | 1997 |
2004 static IPC::Message* Fuzz(IPC::Message* msg, Fuzzer* fuzzer) { | 1998 static IPC::Message* Fuzz(IPC::Message* msg, Fuzzer* fuzzer) { |
2005 return FuzzImpl(msg, fuzzer, base::MakeIndexSequence<sizeof...(Ins)>()); | 1999 return FuzzImpl(msg, fuzzer, base::MakeIndexSequence<sizeof...(Ins)>()); |
2006 } | 2000 } |
2007 | 2001 |
2008 private: | 2002 private: |
2009 template <size_t... Ns> | 2003 template <size_t... Ns> |
2010 static IPC::Message* FuzzImpl(IPC::Message* msg, | 2004 static IPC::Message* FuzzImpl(IPC::Message* msg, |
2011 Fuzzer* fuzzer, | 2005 Fuzzer* fuzzer, |
2012 base::IndexSequence<Ns...>) { | 2006 base::IndexSequence<Ns...>) { |
2013 typename Message::SendParam p; | 2007 typename Message::SendParam p; |
2014 Message* real_msg = static_cast<Message*>(msg); | 2008 Message* real_msg = static_cast<Message*>(msg); |
2015 Message* new_msg = nullptr; | 2009 Message* new_msg = nullptr; |
2016 if (real_msg) { | 2010 if (real_msg) { |
2017 Message::ReadSendParam(real_msg, &p); | 2011 Message::ReadSendParam(real_msg, &p); |
2018 } | 2012 } |
2019 if (FuzzParam(&p, fuzzer)) { | 2013 if (FuzzParam(&p, fuzzer)) { |
2020 new_msg = MessageFactory<Message, Meta::kKind>::New( | 2014 new_msg = MessageFactory<Message, Meta::kKind>::New( |
2021 base::get<Ns>(p)..., static_cast<Outs*>(nullptr)...); | 2015 std::get<Ns>(p)..., static_cast<Outs*>(nullptr)...); |
2022 } | 2016 } |
2023 if (real_msg && new_msg) { | 2017 if (real_msg && new_msg) { |
2024 MessageCracker::CopyMessageID(new_msg, real_msg); | 2018 MessageCracker::CopyMessageID(new_msg, real_msg); |
2025 } else if (!new_msg) { | 2019 } else if (!new_msg) { |
2026 std::cerr << "Don't know how to handle " << Meta::kName << "\n"; | 2020 std::cerr << "Don't know how to handle " << Meta::kName << "\n"; |
2027 } | 2021 } |
2028 return new_msg; | 2022 return new_msg; |
2029 } | 2023 } |
2030 }; | 2024 }; |
2031 | 2025 |
(...skipping 11 matching lines...) Expand all Loading... |
2043 #include "tools/ipc_fuzzer/message_lib/all_message_null_macros.h" | 2037 #include "tools/ipc_fuzzer/message_lib/all_message_null_macros.h" |
2044 #undef IPC_MESSAGE_DECL | 2038 #undef IPC_MESSAGE_DECL |
2045 #define IPC_MESSAGE_DECL(name, ...) \ | 2039 #define IPC_MESSAGE_DECL(name, ...) \ |
2046 (*map)[static_cast<uint32_t>(name::ID)] = FuzzerHelper<name>::Fuzz; | 2040 (*map)[static_cast<uint32_t>(name::ID)] = FuzzerHelper<name>::Fuzz; |
2047 | 2041 |
2048 void PopulateFuzzerFunctionMap(FuzzerFunctionMap* map) { | 2042 void PopulateFuzzerFunctionMap(FuzzerFunctionMap* map) { |
2049 #include "tools/ipc_fuzzer/message_lib/all_messages.h" | 2043 #include "tools/ipc_fuzzer/message_lib/all_messages.h" |
2050 } | 2044 } |
2051 | 2045 |
2052 } // namespace ipc_fuzzer | 2046 } // namespace ipc_fuzzer |
OLD | NEW |