-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add fuzzers for chrono timepoint and localtime,gmtime (#2469)
* add fuzzers for chrono timepoint and localtime,gmtime * reorder cases to improve throughput mutating the first byte of the input now always results in picking on of the two paths. Before, two of the four possible outcomes resulted in doit() not being invoked. * drop the localtime fuzzer * inline aliases * only fuzz std::chrono::system_clock
- Loading branch information
Showing
2 changed files
with
33 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// Copyright (c) 2021, Paul Dreik | ||
// For license information refer to format.h. | ||
#include <fmt/chrono.h> | ||
|
||
#include "fuzzer-common.h" | ||
|
||
/* | ||
* a fuzzer for the chrono timepoints formatters | ||
* C is a clock (std::chrono::system_clock etc) | ||
*/ | ||
template <typename C> void doit(const uint8_t* data, size_t size) { | ||
using Rep = typename C::time_point::rep; | ||
constexpr auto N = sizeof(Rep); | ||
if (size < N) return; | ||
|
||
const auto x = assign_from_buf<Rep>(data); | ||
typename C::duration dur{x}; | ||
typename C::time_point timepoint{dur}; | ||
data += N; | ||
size -= N; | ||
data_to_string format_str(data, size); | ||
|
||
std::string message = fmt::format(format_str.get(), timepoint); | ||
} | ||
|
||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | ||
try { | ||
doit<std::chrono::system_clock>(data, size); | ||
} catch (...) { | ||
} | ||
return 0; | ||
} |