diff options
Diffstat (limited to 'llvm/lib/Fuzzer')
| -rw-r--r-- | llvm/lib/Fuzzer/FuzzerFnAdapter.h | 11 | ||||
| -rw-r--r-- | llvm/lib/Fuzzer/test/FuzzerFnAdapterUnittest.cpp | 9 |
2 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerFnAdapter.h b/llvm/lib/Fuzzer/FuzzerFnAdapter.h index eec378e7e3b..ae121d238dc 100644 --- a/llvm/lib/Fuzzer/FuzzerFnAdapter.h +++ b/llvm/lib/Fuzzer/FuzzerFnAdapter.h @@ -92,6 +92,17 @@ size_t UnpackSingle<std::vector<uint8_t>>(const uint8_t *Data, size_t Size, return Size - Len - 1; } +template <> +size_t UnpackSingle<std::string>(const uint8_t *Data, size_t Size, + std::string *Value) { + if (Size < 1) + return Size; + size_t Len = std::min(static_cast<size_t>(*Data), Size - 1); + std::string S(Data + 1, Data + 1 + Len); + Value->swap(S); + return Size - Len - 1; +} + // Unpacking into arbitrary tuple. // Recursion guard. diff --git a/llvm/lib/Fuzzer/test/FuzzerFnAdapterUnittest.cpp b/llvm/lib/Fuzzer/test/FuzzerFnAdapterUnittest.cpp index a2083d8a9f1..a8b5a149cff 100644 --- a/llvm/lib/Fuzzer/test/FuzzerFnAdapterUnittest.cpp +++ b/llvm/lib/Fuzzer/test/FuzzerFnAdapterUnittest.cpp @@ -70,6 +70,15 @@ TEST(Unpack, Vector) { EXPECT_EQ(8, V[1]); } +TEST(Unpack, String) { + std::tuple<std::string> T; + const auto &S = std::get<0>(T); + + EXPECT_TRUE(Unpack(&T, {2, 3})); + EXPECT_EQ(1ul, S.size()); + EXPECT_EQ(3, S[0]); +} + template <typename Fn> bool UnpackAndApply(Fn F, std::initializer_list<uint8_t> Data) { std::vector<uint8_t> V(Data); |

