| // Copyright 2015 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #include <string> | |
| #include "base/strings/string_tokenizer.h" | |
| void GetAllTokens(base::StringTokenizer& t) { | |
| while (t.GetNext()) { | |
| (void)t.token(); | |
| } | |
| } | |
| // Entry point for LibFuzzer. | |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | |
| uint8_t size_t_bytes = sizeof(size_t); | |
| if (size < size_t_bytes + 1) { | |
| return 0; | |
| } | |
| // Calculate pattern size based on remaining bytes, otherwise fuzzing is | |
| // inefficient with bailouts in most cases. | |
| size_t pattern_size = | |
| *reinterpret_cast<const size_t*>(data) % (size - size_t_bytes); | |
| std::string pattern(reinterpret_cast<const char*>(data + size_t_bytes), | |
| pattern_size); | |
| std::string input( | |
| reinterpret_cast<const char*>(data + size_t_bytes + pattern_size), | |
| size - pattern_size - size_t_bytes); | |
| // Allow quote_chars and options to be set. Otherwise full coverage | |
| // won't be possible since IsQuote, FullGetNext and other functions | |
| // won't be called. | |
| base::StringTokenizer t(input, pattern); | |
| GetAllTokens(t); | |
| base::StringTokenizer t_quote(input, pattern); | |
| t_quote.set_quote_chars("\""); | |
| GetAllTokens(t_quote); | |
| base::StringTokenizer t_options(input, pattern); | |
| t_options.set_options(base::StringTokenizer::RETURN_DELIMS); | |
| GetAllTokens(t_options); | |
| base::StringTokenizer t_quote_and_options(input, pattern); | |
| t_quote_and_options.set_quote_chars("\""); | |
| t_quote_and_options.set_options(base::StringTokenizer::RETURN_DELIMS); | |
| GetAllTokens(t_quote_and_options); | |
| return 0; | |
| } |