[PATCH] D84050: [YAMLIO] Support non-null-terminated inputs

Duncan P. N. Exon Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 17 19:10:25 PST 2020


dexonsmith added inline comments.


================
Comment at: llvm/tools/llvm-yaml-parser-fuzzer/yaml-parser-fuzzer.cpp:13-14
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
-  std::string Input(reinterpret_cast<const char *>(Data), Size);
-  Input.erase(std::remove(Input.begin(), Input.end(), 0), Input.end());
-  llvm::yaml::Input YamlInput(Input);
+  llvm::yaml::Input YamlInput(
+      llvm::StringRef(reinterpret_cast<const char *>(Data), Size));
   YamlInput.setCurrentDocument();
----------------
I wonder if it would also be useful to have logic like this:
```
  auto testYaml = [](const uint8_t *Data, size_t Size) {
    // return true if it parses.
  };

  // Test that there's no crash when parsing the raw data.
  testYaml(Data, Size);

  // Test with 0s filtered out.
  std::string Input(reinterpret_cast<const char *>(Data), Size);
  Input.erase(std::remove(Input.begin(), Input.end(), 0), Input.end());
  Size = Input.size();
  bool TerminatedBy0 = testYaml(Input.data(), Size);

  // Test that an invalid character after the input has no effect.
  Input.push_back(1);
  if (testYaml(Input.data(), Size) != TerminatedBy0)
    __builtin_trap(...);
  return 0;
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D84050/new/

https://reviews.llvm.org/D84050



More information about the llvm-commits mailing list