summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Fuzzer
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Fuzzer')
-rw-r--r--llvm/lib/Fuzzer/FuzzerFnAdapter.h11
-rw-r--r--llvm/lib/Fuzzer/test/FuzzerFnAdapterUnittest.cpp9
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);
OpenPOWER on IntegriCloud