diff options
| author | Mike Aizatsky <aizatsky@chromium.org> | 2016-03-04 23:18:01 +0000 |
|---|---|---|
| committer | Mike Aizatsky <aizatsky@chromium.org> | 2016-03-04 23:18:01 +0000 |
| commit | 243fe2b3a05465e6b46f3cd50769ff8dd5dd281f (patch) | |
| tree | 21707de135ed0b8bd9faa28ec99eb47ca87f9743 /llvm/lib | |
| parent | 71a1c2c619120aac716645e6025b0d34120f038d (diff) | |
| download | bcm5719-llvm-243fe2b3a05465e6b46f3cd50769ff8dd5dd281f.tar.gz bcm5719-llvm-243fe2b3a05465e6b46f3cd50769ff8dd5dd281f.zip | |
[libfuzzer] adding std:string to allowed adaptable argument.
llvm-svn: 262757
Diffstat (limited to 'llvm/lib')
| -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); |

