[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-trail-of-bits-ruzzy":3,"mdc--2dx8qc-key":35,"related-repo-trail-of-bits-ruzzy":3608,"related-org-trail-of-bits-ruzzy":3704},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":30,"sourceUrl":33,"mdContent":34},"ruzzy","fuzz Ruby code and C extensions","Ruzzy is a coverage-guided Ruby fuzzer by Trail of Bits. Use for fuzzing pure Ruby code and Ruby C extensions.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"trail-of-bits","Trail of Bits","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ftrail-of-bits.png","trailofbits",[13,17,20],{"name":14,"slug":15,"type":16},"Security","security","tag",{"name":18,"slug":19,"type":16},"Testing","testing",{"name":21,"slug":22,"type":16},"Ruby","ruby",6139,"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fskills","2026-07-17T06:05:22.116488",null,541,[29],"agent-skills",{"repoUrl":24,"stars":23,"forks":27,"topics":31,"description":32},[29],"Trail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows","https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Ftesting-handbook-skills\u002Fskills\u002Fruzzy","---\nname: ruzzy\ntype: fuzzer\ndescription: >\n  Ruzzy is a coverage-guided Ruby fuzzer by Trail of Bits.\n  Use for fuzzing pure Ruby code and Ruby C extensions.\n---\n\n# Ruzzy\n\nRuzzy is a coverage-guided fuzzer for Ruby built on libFuzzer. It enables fuzzing both pure Ruby code and Ruby C extensions with sanitizer support for detecting memory corruption and undefined behavior.\n\n## When to Use\n\nRuzzy is currently the only production-ready coverage-guided fuzzer for Ruby.\n\n**Choose Ruzzy when:**\n- Fuzzing Ruby applications or libraries\n- Testing Ruby C extensions for memory safety issues\n- You need coverage-guided fuzzing for Ruby code\n- Working with Ruby gems that have native extensions\n\n## Quick Start\n\nSet up environment:\n```bash\nexport ASAN_OPTIONS=\"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0\"\n```\n\nTest with the included toy example:\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby -e 'require \"ruzzy\"; Ruzzy.dummy'\n```\n\nThis should quickly find a crash demonstrating that Ruzzy is working correctly.\n\n## Installation\n\n### Platform Support\n\nRuzzy supports Linux x86-64 and AArch64\u002FARM64. For macOS or Windows, use the [Dockerfile](https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy\u002Fblob\u002Fmain\u002FDockerfile) or [development environment](https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy#developing).\n\n### Prerequisites\n\n- Linux x86-64 or AArch64\u002FARM64\n- Recent version of clang (tested back to 14.0.0, latest release recommended)\n- Ruby with gem installed\n\n### Installation Command\n\nInstall Ruzzy with clang compiler flags:\n\n```bash\nMAKE=\"make --environment-overrides V=1\" \\\nCC=\"\u002Fpath\u002Fto\u002Fclang\" \\\nCXX=\"\u002Fpath\u002Fto\u002Fclang++\" \\\nLDSHARED=\"\u002Fpath\u002Fto\u002Fclang -shared\" \\\nLDSHAREDXX=\"\u002Fpath\u002Fto\u002Fclang++ -shared\" \\\n    gem install ruzzy\n```\n\n**Environment variables explained:**\n- `MAKE`: Overrides make to respect subsequent environment variables\n- `CC`, `CXX`, `LDSHARED`, `LDSHAREDXX`: Ensure proper clang binaries are used for latest features\n\n### Troubleshooting Installation\n\nIf installation fails, enable debug output:\n\n```bash\nRUZZY_DEBUG=1 gem install --verbose ruzzy\n```\n\n### Verification\n\nVerify installation by running the toy example (see Quick Start section).\n\n## Writing a Harness\n\n### Fuzzing Pure Ruby Code\n\nPure Ruby fuzzing requires two scripts due to Ruby interpreter implementation details.\n\n**Tracer script (`test_tracer.rb`):**\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'ruzzy'\n\nRuzzy.trace('test_harness.rb')\n```\n\n**Harness script (`test_harness.rb`):**\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'ruzzy'\n\ndef fuzzing_target(input)\n  # Your code to fuzz here\n  if input.length == 4\n    if input[0] == 'F'\n      if input[1] == 'U'\n        if input[2] == 'Z'\n          if input[3] == 'Z'\n            raise\n          end\n        end\n      end\n    end\n  end\nend\n\ntest_one_input = lambda do |data|\n  fuzzing_target(data)\n  return 0\nend\n\nRuzzy.fuzz(test_one_input)\n```\n\nRun with:\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby test_tracer.rb\n```\n\n### Fuzzing Ruby C Extensions\n\nC extensions can be fuzzed with a single harness file, no tracer needed.\n\n**Example harness for msgpack (`fuzz_msgpack.rb`):**\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'msgpack'\nrequire 'ruzzy'\n\ntest_one_input = lambda do |data|\n  begin\n    MessagePack.unpack(data)\n  rescue Exception\n    # We're looking for memory corruption, not Ruby exceptions\n  end\n  return 0\nend\n\nRuzzy.fuzz(test_one_input)\n```\n\nRun with:\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby fuzz_msgpack.rb\n```\n\n### Harness Rules\n\n| Do | Don't |\n|----|-------|\n| Catch Ruby exceptions if testing C extensions | Let Ruby exceptions crash the fuzzer |\n| Return 0 from test_one_input lambda | Return other values |\n| Keep harness deterministic | Use randomness or time-based logic |\n| Use tracer script for pure Ruby | Skip tracer for pure Ruby code |\n\n> **See Also:** For detailed harness writing techniques, patterns for handling complex inputs,\n> and advanced strategies, see the **fuzz-harness-writing** technique skill.\n\n## Compilation\n\n### Installing Gems with Sanitizers\n\nWhen installing Ruby gems with C extensions for fuzzing, compile with sanitizer flags:\n\n```bash\nMAKE=\"make --environment-overrides V=1\" \\\nCC=\"\u002Fpath\u002Fto\u002Fclang\" \\\nCXX=\"\u002Fpath\u002Fto\u002Fclang++\" \\\nLDSHARED=\"\u002Fpath\u002Fto\u002Fclang -shared\" \\\nLDSHAREDXX=\"\u002Fpath\u002Fto\u002Fclang++ -shared\" \\\nCFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\nCXXFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\n    gem install \u003Cgem-name>\n```\n\n### Build Flags\n\n| Flag | Purpose |\n|------|---------|\n| `-fsanitize=address,fuzzer-no-link` | Enable AddressSanitizer and fuzzer instrumentation |\n| `-fno-omit-frame-pointer` | Improve stack trace quality |\n| `-fno-common` | Better compatibility with sanitizers |\n| `-fPIC` | Position-independent code for shared libraries |\n| `-g` | Include debug symbols |\n\n## Running Campaigns\n\n### Environment Setup\n\nBefore running any fuzzing campaign, set ASAN_OPTIONS:\n\n```bash\nexport ASAN_OPTIONS=\"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0\"\n```\n\n**Options explained:**\n1. `allocator_may_return_null=1`: Skip common low-impact allocation failures (DoS)\n2. `detect_leaks=0`: Ruby interpreter leaks data, ignore these for now\n3. `use_sigaltstack=0`: Ruby recommends disabling sigaltstack with ASan\n\n### Basic Run\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb\n```\n\n**Note:** `LD_PRELOAD` is required for sanitizer injection. Unlike `ASAN_OPTIONS`, do not export it as it may interfere with other programs.\n\n### With Corpus\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb \u002Fpath\u002Fto\u002Fcorpus\n```\n\n### Passing libFuzzer Options\n\nAll libFuzzer options can be passed as arguments:\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb \u002Fpath\u002Fto\u002Fcorpus -max_len=1024 -timeout=10\n```\n\nSee [libFuzzer options](https:\u002F\u002Fllvm.org\u002Fdocs\u002FLibFuzzer.html#options) for full reference.\n\n### Reproducing Crashes\n\nRe-run a crash case by passing the crash file:\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb .\u002Fcrash-253420c1158bc6382093d409ce2e9cff5806e980\n```\n\n### Interpreting Output\n\n| Output | Meaning |\n|--------|---------|\n| `INFO: Running with entropic power schedule` | Fuzzing campaign started |\n| `ERROR: AddressSanitizer: heap-use-after-free` | Memory corruption detected |\n| `SUMMARY: libFuzzer: fuzz target exited` | Ruby exception occurred |\n| `artifact_prefix='.\u002F'; Test unit written to .\u002Fcrash-*` | Crash input saved |\n| `Base64: ...` | Base64 encoding of crash input |\n\n## Sanitizer Integration\n\n### AddressSanitizer (ASan)\n\nRuzzy includes a pre-compiled AddressSanitizer library:\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb\n```\n\nUse ASan for detecting:\n- Heap buffer overflows\n- Stack buffer overflows\n- Use-after-free\n- Double-free\n- Memory leaks (disabled by default in Ruzzy)\n\n### UndefinedBehaviorSanitizer (UBSan)\n\nRuzzy also includes UBSan:\n\n```bash\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::UBSAN_PATH') \\\n    ruby harness.rb\n```\n\nUse UBSan for detecting:\n- Signed integer overflow\n- Null pointer dereferences\n- Misaligned memory access\n- Division by zero\n\n### Common Sanitizer Issues\n\n| Issue | Solution |\n|-------|----------|\n| Ruby interpreter leak warnings | Use `ASAN_OPTIONS=detect_leaks=0` |\n| Sigaltstack conflicts | Use `ASAN_OPTIONS=use_sigaltstack=0` |\n| Allocation failure spam | Use `ASAN_OPTIONS=allocator_may_return_null=1` |\n| LD_PRELOAD interferes with tools | Don't export it; set inline with ruby command |\n\n> **See Also:** For detailed sanitizer configuration, common issues, and advanced flags,\n> see the **address-sanitizer** and **undefined-behavior-sanitizer** technique skills.\n\n## Real-World Examples\n\n### Example: msgpack-ruby\n\nFuzzing the msgpack MessagePack parser for memory corruption.\n\n**Install with sanitizers:**\n\n```bash\nMAKE=\"make --environment-overrides V=1\" \\\nCC=\"\u002Fpath\u002Fto\u002Fclang\" \\\nCXX=\"\u002Fpath\u002Fto\u002Fclang++\" \\\nLDSHARED=\"\u002Fpath\u002Fto\u002Fclang -shared\" \\\nLDSHAREDXX=\"\u002Fpath\u002Fto\u002Fclang++ -shared\" \\\nCFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\nCXXFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\n    gem install msgpack\n```\n\n**Harness (`fuzz_msgpack.rb`):**\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'msgpack'\nrequire 'ruzzy'\n\ntest_one_input = lambda do |data|\n  begin\n    MessagePack.unpack(data)\n  rescue Exception\n    # We're looking for memory corruption, not Ruby exceptions\n  end\n  return 0\nend\n\nRuzzy.fuzz(test_one_input)\n```\n\n**Run:**\n\n```bash\nexport ASAN_OPTIONS=\"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0\"\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby fuzz_msgpack.rb\n```\n\n### Example: Pure Ruby Target\n\nFuzzing pure Ruby code with a custom parser.\n\n**Tracer (`test_tracer.rb`):**\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'ruzzy'\n\nRuzzy.trace('test_harness.rb')\n```\n\n**Harness (`test_harness.rb`):**\n\n```ruby\n# frozen_string_literal: true\n\nrequire 'ruzzy'\nrequire_relative 'my_parser'\n\ntest_one_input = lambda do |data|\n  begin\n    MyParser.parse(data)\n  rescue StandardError\n    # Expected exceptions from malformed input\n  end\n  return 0\nend\n\nRuzzy.fuzz(test_one_input)\n```\n\n**Run:**\n\n```bash\nexport ASAN_OPTIONS=\"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0\"\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby test_tracer.rb\n```\n\n## Troubleshooting\n\n| Problem | Cause | Solution |\n|---------|-------|----------|\n| Installation fails | Wrong clang version or path | Verify clang path, use clang 14.0.0+ |\n| `cannot open shared object file` | LD_PRELOAD not set | Set LD_PRELOAD inline with ruby command |\n| Fuzzer immediately exits | Missing corpus directory | Create corpus directory or pass as argument |\n| No coverage progress | Pure Ruby needs tracer | Use tracer script for pure Ruby code |\n| Leak detection spam | Ruby interpreter leaks | Set `ASAN_OPTIONS=detect_leaks=0` |\n| Installation debug needed | Compilation errors | Use `RUZZY_DEBUG=1 gem install --verbose ruzzy` |\n\n## Related Skills\n\n### Technique Skills\n\n| Skill | Use Case |\n|-------|----------|\n| **fuzz-harness-writing** | Detailed guidance on writing effective harnesses |\n| **address-sanitizer** | Memory error detection during fuzzing |\n| **undefined-behavior-sanitizer** | Detecting undefined behavior in C extensions |\n| **libfuzzer** | Understanding libFuzzer options (Ruzzy is built on libFuzzer) |\n\n### Related Fuzzers\n\n| Skill | When to Consider |\n|-------|------------------|\n| **libfuzzer** | When fuzzing Ruby C extension code directly in C\u002FC++ |\n| **aflpp** | Alternative approach for fuzzing Ruby by instrumenting Ruby interpreter |\n\n## Resources\n\n### Key External Resources\n\n**[Introducing Ruzzy, a coverage-guided Ruby fuzzer](https:\u002F\u002Fblog.trailofbits.com\u002F2024\u002F03\u002F29\u002Fintroducing-ruzzy-a-coverage-guided-ruby-fuzzer\u002F)**\nOfficial Trail of Bits blog post announcing Ruzzy, covering motivation, architecture, and initial results.\n\n**[Ruzzy GitHub Repository](https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy)**\nSource code, additional examples, and development instructions.\n\n**[libFuzzer Documentation](https:\u002F\u002Fllvm.org\u002Fdocs\u002FLibFuzzer.html)**\nSince Ruzzy is built on libFuzzer, understanding libFuzzer options and behavior is valuable.\n\n**[Fuzzing Ruby C extensions](https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy#fuzzing-ruby-c-extensions)**\nDetailed guide on fuzzing C extensions with compilation flags and examples.\n\n**[Fuzzing pure Ruby code](https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy#fuzzing-pure-ruby-code)**\nDetailed guide on the tracer pattern required for pure Ruby fuzzing.\n",{"data":36,"body":38},{"name":4,"type":37,"description":6},"fuzzer",{"type":39,"children":40},"root",[41,49,55,62,67,76,101,107,112,164,169,251,256,262,269,294,300,318,324,329,487,495,541,547,552,594,600,605,611,617,622,638,686,701,920,925,983,989,994,1009,1126,1130,1188,1194,1274,1295,1301,1307,1312,1518,1524,1631,1637,1643,1648,1681,1689,1726,1732,1790,1815,1821,1884,1890,1895,1967,1981,1987,1992,2054,2060,2167,2173,2179,2184,2240,2245,2273,2279,2284,2342,2347,2370,2376,2466,2492,2498,2504,2509,2517,2705,2719,2830,2838,2922,2928,2933,2947,2988,3001,3117,3124,3208,3214,3362,3368,3374,3457,3463,3515,3521,3527,3542,3557,3572,3587,3602],{"type":42,"tag":43,"props":44,"children":45},"element","h1",{"id":4},[46],{"type":47,"value":48},"text","Ruzzy",{"type":42,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"Ruzzy is a coverage-guided fuzzer for Ruby built on libFuzzer. It enables fuzzing both pure Ruby code and Ruby C extensions with sanitizer support for detecting memory corruption and undefined behavior.",{"type":42,"tag":56,"props":57,"children":59},"h2",{"id":58},"when-to-use",[60],{"type":47,"value":61},"When to Use",{"type":42,"tag":50,"props":63,"children":64},{},[65],{"type":47,"value":66},"Ruzzy is currently the only production-ready coverage-guided fuzzer for Ruby.",{"type":42,"tag":50,"props":68,"children":69},{},[70],{"type":42,"tag":71,"props":72,"children":73},"strong",{},[74],{"type":47,"value":75},"Choose Ruzzy when:",{"type":42,"tag":77,"props":78,"children":79},"ul",{},[80,86,91,96],{"type":42,"tag":81,"props":82,"children":83},"li",{},[84],{"type":47,"value":85},"Fuzzing Ruby applications or libraries",{"type":42,"tag":81,"props":87,"children":88},{},[89],{"type":47,"value":90},"Testing Ruby C extensions for memory safety issues",{"type":42,"tag":81,"props":92,"children":93},{},[94],{"type":47,"value":95},"You need coverage-guided fuzzing for Ruby code",{"type":42,"tag":81,"props":97,"children":98},{},[99],{"type":47,"value":100},"Working with Ruby gems that have native extensions",{"type":42,"tag":56,"props":102,"children":104},{"id":103},"quick-start",[105],{"type":47,"value":106},"Quick Start",{"type":42,"tag":50,"props":108,"children":109},{},[110],{"type":47,"value":111},"Set up environment:",{"type":42,"tag":113,"props":114,"children":119},"pre",{"className":115,"code":116,"language":117,"meta":118,"style":118},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export ASAN_OPTIONS=\"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0\"\n","bash","",[120],{"type":42,"tag":121,"props":122,"children":123},"code",{"__ignoreMap":118},[124],{"type":42,"tag":125,"props":126,"children":129},"span",{"class":127,"line":128},"line",1,[130,136,142,148,153,159],{"type":42,"tag":125,"props":131,"children":133},{"style":132},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[134],{"type":47,"value":135},"export",{"type":42,"tag":125,"props":137,"children":139},{"style":138},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[140],{"type":47,"value":141}," ASAN_OPTIONS",{"type":42,"tag":125,"props":143,"children":145},{"style":144},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[146],{"type":47,"value":147},"=",{"type":42,"tag":125,"props":149,"children":150},{"style":144},[151],{"type":47,"value":152},"\"",{"type":42,"tag":125,"props":154,"children":156},{"style":155},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[157],{"type":47,"value":158},"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0",{"type":42,"tag":125,"props":160,"children":161},{"style":144},[162],{"type":47,"value":163},"\"\n",{"type":42,"tag":50,"props":165,"children":166},{},[167],{"type":47,"value":168},"Test with the included toy example:",{"type":42,"tag":113,"props":170,"children":172},{"className":115,"code":171,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby -e 'require \"ruzzy\"; Ruzzy.dummy'\n",[173],{"type":42,"tag":121,"props":174,"children":175},{"__ignoreMap":118},[176,224],{"type":42,"tag":125,"props":177,"children":178},{"class":127,"line":128},[179,184,189,194,199,204,209,214,219],{"type":42,"tag":125,"props":180,"children":181},{"style":138},[182],{"type":47,"value":183},"LD_PRELOAD",{"type":42,"tag":125,"props":185,"children":186},{"style":144},[187],{"type":47,"value":188},"=$(",{"type":42,"tag":125,"props":190,"children":192},{"style":191},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[193],{"type":47,"value":22},{"type":42,"tag":125,"props":195,"children":196},{"style":155},[197],{"type":47,"value":198}," -e",{"type":42,"tag":125,"props":200,"children":201},{"style":144},[202],{"type":47,"value":203}," '",{"type":42,"tag":125,"props":205,"children":206},{"style":155},[207],{"type":47,"value":208},"require \"ruzzy\"; print Ruzzy::ASAN_PATH",{"type":42,"tag":125,"props":210,"children":211},{"style":144},[212],{"type":47,"value":213},"'",{"type":42,"tag":125,"props":215,"children":216},{"style":144},[217],{"type":47,"value":218},")",{"type":42,"tag":125,"props":220,"children":221},{"style":191},[222],{"type":47,"value":223}," \\\n",{"type":42,"tag":125,"props":225,"children":227},{"class":127,"line":226},2,[228,233,237,241,246],{"type":42,"tag":125,"props":229,"children":230},{"style":155},[231],{"type":47,"value":232},"    ruby",{"type":42,"tag":125,"props":234,"children":235},{"style":155},[236],{"type":47,"value":198},{"type":42,"tag":125,"props":238,"children":239},{"style":144},[240],{"type":47,"value":203},{"type":42,"tag":125,"props":242,"children":243},{"style":155},[244],{"type":47,"value":245},"require \"ruzzy\"; Ruzzy.dummy",{"type":42,"tag":125,"props":247,"children":248},{"style":144},[249],{"type":47,"value":250},"'\n",{"type":42,"tag":50,"props":252,"children":253},{},[254],{"type":47,"value":255},"This should quickly find a crash demonstrating that Ruzzy is working correctly.",{"type":42,"tag":56,"props":257,"children":259},{"id":258},"installation",[260],{"type":47,"value":261},"Installation",{"type":42,"tag":263,"props":264,"children":266},"h3",{"id":265},"platform-support",[267],{"type":47,"value":268},"Platform Support",{"type":42,"tag":50,"props":270,"children":271},{},[272,274,283,285,292],{"type":47,"value":273},"Ruzzy supports Linux x86-64 and AArch64\u002FARM64. For macOS or Windows, use the ",{"type":42,"tag":275,"props":276,"children":280},"a",{"href":277,"rel":278},"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy\u002Fblob\u002Fmain\u002FDockerfile",[279],"nofollow",[281],{"type":47,"value":282},"Dockerfile",{"type":47,"value":284}," or ",{"type":42,"tag":275,"props":286,"children":289},{"href":287,"rel":288},"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy#developing",[279],[290],{"type":47,"value":291},"development environment",{"type":47,"value":293},".",{"type":42,"tag":263,"props":295,"children":297},{"id":296},"prerequisites",[298],{"type":47,"value":299},"Prerequisites",{"type":42,"tag":77,"props":301,"children":302},{},[303,308,313],{"type":42,"tag":81,"props":304,"children":305},{},[306],{"type":47,"value":307},"Linux x86-64 or AArch64\u002FARM64",{"type":42,"tag":81,"props":309,"children":310},{},[311],{"type":47,"value":312},"Recent version of clang (tested back to 14.0.0, latest release recommended)",{"type":42,"tag":81,"props":314,"children":315},{},[316],{"type":47,"value":317},"Ruby with gem installed",{"type":42,"tag":263,"props":319,"children":321},{"id":320},"installation-command",[322],{"type":47,"value":323},"Installation Command",{"type":42,"tag":50,"props":325,"children":326},{},[327],{"type":47,"value":328},"Install Ruzzy with clang compiler flags:",{"type":42,"tag":113,"props":330,"children":332},{"className":115,"code":331,"language":117,"meta":118,"style":118},"MAKE=\"make --environment-overrides V=1\" \\\nCC=\"\u002Fpath\u002Fto\u002Fclang\" \\\nCXX=\"\u002Fpath\u002Fto\u002Fclang++\" \\\nLDSHARED=\"\u002Fpath\u002Fto\u002Fclang -shared\" \\\nLDSHAREDXX=\"\u002Fpath\u002Fto\u002Fclang++ -shared\" \\\n    gem install ruzzy\n",[333],{"type":42,"tag":121,"props":334,"children":335},{"__ignoreMap":118},[336,365,390,416,442,468],{"type":42,"tag":125,"props":337,"children":338},{"class":127,"line":128},[339,344,348,352,357,361],{"type":42,"tag":125,"props":340,"children":341},{"style":138},[342],{"type":47,"value":343},"MAKE",{"type":42,"tag":125,"props":345,"children":346},{"style":144},[347],{"type":47,"value":147},{"type":42,"tag":125,"props":349,"children":350},{"style":144},[351],{"type":47,"value":152},{"type":42,"tag":125,"props":353,"children":354},{"style":155},[355],{"type":47,"value":356},"make --environment-overrides V=1",{"type":42,"tag":125,"props":358,"children":359},{"style":144},[360],{"type":47,"value":152},{"type":42,"tag":125,"props":362,"children":363},{"style":191},[364],{"type":47,"value":223},{"type":42,"tag":125,"props":366,"children":367},{"class":127,"line":226},[368,373,377,382,386],{"type":42,"tag":125,"props":369,"children":370},{"style":138},[371],{"type":47,"value":372},"CC=",{"type":42,"tag":125,"props":374,"children":375},{"style":144},[376],{"type":47,"value":152},{"type":42,"tag":125,"props":378,"children":379},{"style":155},[380],{"type":47,"value":381},"\u002Fpath\u002Fto\u002Fclang",{"type":42,"tag":125,"props":383,"children":384},{"style":144},[385],{"type":47,"value":152},{"type":42,"tag":125,"props":387,"children":388},{"style":138},[389],{"type":47,"value":223},{"type":42,"tag":125,"props":391,"children":393},{"class":127,"line":392},3,[394,399,403,408,412],{"type":42,"tag":125,"props":395,"children":396},{"style":138},[397],{"type":47,"value":398},"CXX=",{"type":42,"tag":125,"props":400,"children":401},{"style":144},[402],{"type":47,"value":152},{"type":42,"tag":125,"props":404,"children":405},{"style":155},[406],{"type":47,"value":407},"\u002Fpath\u002Fto\u002Fclang++",{"type":42,"tag":125,"props":409,"children":410},{"style":144},[411],{"type":47,"value":152},{"type":42,"tag":125,"props":413,"children":414},{"style":138},[415],{"type":47,"value":223},{"type":42,"tag":125,"props":417,"children":419},{"class":127,"line":418},4,[420,425,429,434,438],{"type":42,"tag":125,"props":421,"children":422},{"style":138},[423],{"type":47,"value":424},"LDSHARED=",{"type":42,"tag":125,"props":426,"children":427},{"style":144},[428],{"type":47,"value":152},{"type":42,"tag":125,"props":430,"children":431},{"style":155},[432],{"type":47,"value":433},"\u002Fpath\u002Fto\u002Fclang -shared",{"type":42,"tag":125,"props":435,"children":436},{"style":144},[437],{"type":47,"value":152},{"type":42,"tag":125,"props":439,"children":440},{"style":138},[441],{"type":47,"value":223},{"type":42,"tag":125,"props":443,"children":445},{"class":127,"line":444},5,[446,451,455,460,464],{"type":42,"tag":125,"props":447,"children":448},{"style":138},[449],{"type":47,"value":450},"LDSHAREDXX=",{"type":42,"tag":125,"props":452,"children":453},{"style":144},[454],{"type":47,"value":152},{"type":42,"tag":125,"props":456,"children":457},{"style":155},[458],{"type":47,"value":459},"\u002Fpath\u002Fto\u002Fclang++ -shared",{"type":42,"tag":125,"props":461,"children":462},{"style":144},[463],{"type":47,"value":152},{"type":42,"tag":125,"props":465,"children":466},{"style":138},[467],{"type":47,"value":223},{"type":42,"tag":125,"props":469,"children":471},{"class":127,"line":470},6,[472,477,482],{"type":42,"tag":125,"props":473,"children":474},{"style":155},[475],{"type":47,"value":476},"    gem",{"type":42,"tag":125,"props":478,"children":479},{"style":155},[480],{"type":47,"value":481}," install",{"type":42,"tag":125,"props":483,"children":484},{"style":155},[485],{"type":47,"value":486}," ruzzy\n",{"type":42,"tag":50,"props":488,"children":489},{},[490],{"type":42,"tag":71,"props":491,"children":492},{},[493],{"type":47,"value":494},"Environment variables explained:",{"type":42,"tag":77,"props":496,"children":497},{},[498,508],{"type":42,"tag":81,"props":499,"children":500},{},[501,506],{"type":42,"tag":121,"props":502,"children":504},{"className":503},[],[505],{"type":47,"value":343},{"type":47,"value":507},": Overrides make to respect subsequent environment variables",{"type":42,"tag":81,"props":509,"children":510},{},[511,517,519,525,526,532,533,539],{"type":42,"tag":121,"props":512,"children":514},{"className":513},[],[515],{"type":47,"value":516},"CC",{"type":47,"value":518},", ",{"type":42,"tag":121,"props":520,"children":522},{"className":521},[],[523],{"type":47,"value":524},"CXX",{"type":47,"value":518},{"type":42,"tag":121,"props":527,"children":529},{"className":528},[],[530],{"type":47,"value":531},"LDSHARED",{"type":47,"value":518},{"type":42,"tag":121,"props":534,"children":536},{"className":535},[],[537],{"type":47,"value":538},"LDSHAREDXX",{"type":47,"value":540},": Ensure proper clang binaries are used for latest features",{"type":42,"tag":263,"props":542,"children":544},{"id":543},"troubleshooting-installation",[545],{"type":47,"value":546},"Troubleshooting Installation",{"type":42,"tag":50,"props":548,"children":549},{},[550],{"type":47,"value":551},"If installation fails, enable debug output:",{"type":42,"tag":113,"props":553,"children":555},{"className":115,"code":554,"language":117,"meta":118,"style":118},"RUZZY_DEBUG=1 gem install --verbose ruzzy\n",[556],{"type":42,"tag":121,"props":557,"children":558},{"__ignoreMap":118},[559],{"type":42,"tag":125,"props":560,"children":561},{"class":127,"line":128},[562,567,571,576,581,585,590],{"type":42,"tag":125,"props":563,"children":564},{"style":138},[565],{"type":47,"value":566},"RUZZY_DEBUG",{"type":42,"tag":125,"props":568,"children":569},{"style":144},[570],{"type":47,"value":147},{"type":42,"tag":125,"props":572,"children":573},{"style":155},[574],{"type":47,"value":575},"1",{"type":42,"tag":125,"props":577,"children":578},{"style":191},[579],{"type":47,"value":580}," gem",{"type":42,"tag":125,"props":582,"children":583},{"style":155},[584],{"type":47,"value":481},{"type":42,"tag":125,"props":586,"children":587},{"style":155},[588],{"type":47,"value":589}," --verbose",{"type":42,"tag":125,"props":591,"children":592},{"style":155},[593],{"type":47,"value":486},{"type":42,"tag":263,"props":595,"children":597},{"id":596},"verification",[598],{"type":47,"value":599},"Verification",{"type":42,"tag":50,"props":601,"children":602},{},[603],{"type":47,"value":604},"Verify installation by running the toy example (see Quick Start section).",{"type":42,"tag":56,"props":606,"children":608},{"id":607},"writing-a-harness",[609],{"type":47,"value":610},"Writing a Harness",{"type":42,"tag":263,"props":612,"children":614},{"id":613},"fuzzing-pure-ruby-code",[615],{"type":47,"value":616},"Fuzzing Pure Ruby Code",{"type":42,"tag":50,"props":618,"children":619},{},[620],{"type":47,"value":621},"Pure Ruby fuzzing requires two scripts due to Ruby interpreter implementation details.",{"type":42,"tag":50,"props":623,"children":624},{},[625],{"type":42,"tag":71,"props":626,"children":627},{},[628,630,636],{"type":47,"value":629},"Tracer script (",{"type":42,"tag":121,"props":631,"children":633},{"className":632},[],[634],{"type":47,"value":635},"test_tracer.rb",{"type":47,"value":637},"):",{"type":42,"tag":113,"props":639,"children":642},{"className":640,"code":641,"language":22,"meta":118,"style":118},"language-ruby shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# frozen_string_literal: true\n\nrequire 'ruzzy'\n\nRuzzy.trace('test_harness.rb')\n",[643],{"type":42,"tag":121,"props":644,"children":645},{"__ignoreMap":118},[646,654,663,671,678],{"type":42,"tag":125,"props":647,"children":648},{"class":127,"line":128},[649],{"type":42,"tag":125,"props":650,"children":651},{},[652],{"type":47,"value":653},"# frozen_string_literal: true\n",{"type":42,"tag":125,"props":655,"children":656},{"class":127,"line":226},[657],{"type":42,"tag":125,"props":658,"children":660},{"emptyLinePlaceholder":659},true,[661],{"type":47,"value":662},"\n",{"type":42,"tag":125,"props":664,"children":665},{"class":127,"line":392},[666],{"type":42,"tag":125,"props":667,"children":668},{},[669],{"type":47,"value":670},"require 'ruzzy'\n",{"type":42,"tag":125,"props":672,"children":673},{"class":127,"line":418},[674],{"type":42,"tag":125,"props":675,"children":676},{"emptyLinePlaceholder":659},[677],{"type":47,"value":662},{"type":42,"tag":125,"props":679,"children":680},{"class":127,"line":444},[681],{"type":42,"tag":125,"props":682,"children":683},{},[684],{"type":47,"value":685},"Ruzzy.trace('test_harness.rb')\n",{"type":42,"tag":50,"props":687,"children":688},{},[689],{"type":42,"tag":71,"props":690,"children":691},{},[692,694,700],{"type":47,"value":693},"Harness script (",{"type":42,"tag":121,"props":695,"children":697},{"className":696},[],[698],{"type":47,"value":699},"test_harness.rb",{"type":47,"value":637},{"type":42,"tag":113,"props":702,"children":704},{"className":640,"code":703,"language":22,"meta":118,"style":118},"# frozen_string_literal: true\n\nrequire 'ruzzy'\n\ndef fuzzing_target(input)\n  # Your code to fuzz here\n  if input.length == 4\n    if input[0] == 'F'\n      if input[1] == 'U'\n        if input[2] == 'Z'\n          if input[3] == 'Z'\n            raise\n          end\n        end\n      end\n    end\n  end\nend\n\ntest_one_input = lambda do |data|\n  fuzzing_target(data)\n  return 0\nend\n\nRuzzy.fuzz(test_one_input)\n",[705],{"type":42,"tag":121,"props":706,"children":707},{"__ignoreMap":118},[708,715,722,729,736,744,752,761,770,779,788,797,806,815,824,833,842,851,860,868,877,886,895,903,911],{"type":42,"tag":125,"props":709,"children":710},{"class":127,"line":128},[711],{"type":42,"tag":125,"props":712,"children":713},{},[714],{"type":47,"value":653},{"type":42,"tag":125,"props":716,"children":717},{"class":127,"line":226},[718],{"type":42,"tag":125,"props":719,"children":720},{"emptyLinePlaceholder":659},[721],{"type":47,"value":662},{"type":42,"tag":125,"props":723,"children":724},{"class":127,"line":392},[725],{"type":42,"tag":125,"props":726,"children":727},{},[728],{"type":47,"value":670},{"type":42,"tag":125,"props":730,"children":731},{"class":127,"line":418},[732],{"type":42,"tag":125,"props":733,"children":734},{"emptyLinePlaceholder":659},[735],{"type":47,"value":662},{"type":42,"tag":125,"props":737,"children":738},{"class":127,"line":444},[739],{"type":42,"tag":125,"props":740,"children":741},{},[742],{"type":47,"value":743},"def fuzzing_target(input)\n",{"type":42,"tag":125,"props":745,"children":746},{"class":127,"line":470},[747],{"type":42,"tag":125,"props":748,"children":749},{},[750],{"type":47,"value":751},"  # Your code to fuzz here\n",{"type":42,"tag":125,"props":753,"children":755},{"class":127,"line":754},7,[756],{"type":42,"tag":125,"props":757,"children":758},{},[759],{"type":47,"value":760},"  if input.length == 4\n",{"type":42,"tag":125,"props":762,"children":764},{"class":127,"line":763},8,[765],{"type":42,"tag":125,"props":766,"children":767},{},[768],{"type":47,"value":769},"    if input[0] == 'F'\n",{"type":42,"tag":125,"props":771,"children":773},{"class":127,"line":772},9,[774],{"type":42,"tag":125,"props":775,"children":776},{},[777],{"type":47,"value":778},"      if input[1] == 'U'\n",{"type":42,"tag":125,"props":780,"children":782},{"class":127,"line":781},10,[783],{"type":42,"tag":125,"props":784,"children":785},{},[786],{"type":47,"value":787},"        if input[2] == 'Z'\n",{"type":42,"tag":125,"props":789,"children":791},{"class":127,"line":790},11,[792],{"type":42,"tag":125,"props":793,"children":794},{},[795],{"type":47,"value":796},"          if input[3] == 'Z'\n",{"type":42,"tag":125,"props":798,"children":800},{"class":127,"line":799},12,[801],{"type":42,"tag":125,"props":802,"children":803},{},[804],{"type":47,"value":805},"            raise\n",{"type":42,"tag":125,"props":807,"children":809},{"class":127,"line":808},13,[810],{"type":42,"tag":125,"props":811,"children":812},{},[813],{"type":47,"value":814},"          end\n",{"type":42,"tag":125,"props":816,"children":818},{"class":127,"line":817},14,[819],{"type":42,"tag":125,"props":820,"children":821},{},[822],{"type":47,"value":823},"        end\n",{"type":42,"tag":125,"props":825,"children":827},{"class":127,"line":826},15,[828],{"type":42,"tag":125,"props":829,"children":830},{},[831],{"type":47,"value":832},"      end\n",{"type":42,"tag":125,"props":834,"children":836},{"class":127,"line":835},16,[837],{"type":42,"tag":125,"props":838,"children":839},{},[840],{"type":47,"value":841},"    end\n",{"type":42,"tag":125,"props":843,"children":845},{"class":127,"line":844},17,[846],{"type":42,"tag":125,"props":847,"children":848},{},[849],{"type":47,"value":850},"  end\n",{"type":42,"tag":125,"props":852,"children":854},{"class":127,"line":853},18,[855],{"type":42,"tag":125,"props":856,"children":857},{},[858],{"type":47,"value":859},"end\n",{"type":42,"tag":125,"props":861,"children":863},{"class":127,"line":862},19,[864],{"type":42,"tag":125,"props":865,"children":866},{"emptyLinePlaceholder":659},[867],{"type":47,"value":662},{"type":42,"tag":125,"props":869,"children":871},{"class":127,"line":870},20,[872],{"type":42,"tag":125,"props":873,"children":874},{},[875],{"type":47,"value":876},"test_one_input = lambda do |data|\n",{"type":42,"tag":125,"props":878,"children":880},{"class":127,"line":879},21,[881],{"type":42,"tag":125,"props":882,"children":883},{},[884],{"type":47,"value":885},"  fuzzing_target(data)\n",{"type":42,"tag":125,"props":887,"children":889},{"class":127,"line":888},22,[890],{"type":42,"tag":125,"props":891,"children":892},{},[893],{"type":47,"value":894},"  return 0\n",{"type":42,"tag":125,"props":896,"children":898},{"class":127,"line":897},23,[899],{"type":42,"tag":125,"props":900,"children":901},{},[902],{"type":47,"value":859},{"type":42,"tag":125,"props":904,"children":906},{"class":127,"line":905},24,[907],{"type":42,"tag":125,"props":908,"children":909},{"emptyLinePlaceholder":659},[910],{"type":47,"value":662},{"type":42,"tag":125,"props":912,"children":914},{"class":127,"line":913},25,[915],{"type":42,"tag":125,"props":916,"children":917},{},[918],{"type":47,"value":919},"Ruzzy.fuzz(test_one_input)\n",{"type":42,"tag":50,"props":921,"children":922},{},[923],{"type":47,"value":924},"Run with:",{"type":42,"tag":113,"props":926,"children":928},{"className":115,"code":927,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby test_tracer.rb\n",[929],{"type":42,"tag":121,"props":930,"children":931},{"__ignoreMap":118},[932,971],{"type":42,"tag":125,"props":933,"children":934},{"class":127,"line":128},[935,939,943,947,951,955,959,963,967],{"type":42,"tag":125,"props":936,"children":937},{"style":138},[938],{"type":47,"value":183},{"type":42,"tag":125,"props":940,"children":941},{"style":144},[942],{"type":47,"value":188},{"type":42,"tag":125,"props":944,"children":945},{"style":191},[946],{"type":47,"value":22},{"type":42,"tag":125,"props":948,"children":949},{"style":155},[950],{"type":47,"value":198},{"type":42,"tag":125,"props":952,"children":953},{"style":144},[954],{"type":47,"value":203},{"type":42,"tag":125,"props":956,"children":957},{"style":155},[958],{"type":47,"value":208},{"type":42,"tag":125,"props":960,"children":961},{"style":144},[962],{"type":47,"value":213},{"type":42,"tag":125,"props":964,"children":965},{"style":144},[966],{"type":47,"value":218},{"type":42,"tag":125,"props":968,"children":969},{"style":191},[970],{"type":47,"value":223},{"type":42,"tag":125,"props":972,"children":973},{"class":127,"line":226},[974,978],{"type":42,"tag":125,"props":975,"children":976},{"style":155},[977],{"type":47,"value":232},{"type":42,"tag":125,"props":979,"children":980},{"style":155},[981],{"type":47,"value":982}," test_tracer.rb\n",{"type":42,"tag":263,"props":984,"children":986},{"id":985},"fuzzing-ruby-c-extensions",[987],{"type":47,"value":988},"Fuzzing Ruby C Extensions",{"type":42,"tag":50,"props":990,"children":991},{},[992],{"type":47,"value":993},"C extensions can be fuzzed with a single harness file, no tracer needed.",{"type":42,"tag":50,"props":995,"children":996},{},[997],{"type":42,"tag":71,"props":998,"children":999},{},[1000,1002,1008],{"type":47,"value":1001},"Example harness for msgpack (",{"type":42,"tag":121,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":47,"value":1007},"fuzz_msgpack.rb",{"type":47,"value":637},{"type":42,"tag":113,"props":1010,"children":1012},{"className":640,"code":1011,"language":22,"meta":118,"style":118},"# frozen_string_literal: true\n\nrequire 'msgpack'\nrequire 'ruzzy'\n\ntest_one_input = lambda do |data|\n  begin\n    MessagePack.unpack(data)\n  rescue Exception\n    # We're looking for memory corruption, not Ruby exceptions\n  end\n  return 0\nend\n\nRuzzy.fuzz(test_one_input)\n",[1013],{"type":42,"tag":121,"props":1014,"children":1015},{"__ignoreMap":118},[1016,1023,1030,1038,1045,1052,1059,1067,1075,1083,1091,1098,1105,1112,1119],{"type":42,"tag":125,"props":1017,"children":1018},{"class":127,"line":128},[1019],{"type":42,"tag":125,"props":1020,"children":1021},{},[1022],{"type":47,"value":653},{"type":42,"tag":125,"props":1024,"children":1025},{"class":127,"line":226},[1026],{"type":42,"tag":125,"props":1027,"children":1028},{"emptyLinePlaceholder":659},[1029],{"type":47,"value":662},{"type":42,"tag":125,"props":1031,"children":1032},{"class":127,"line":392},[1033],{"type":42,"tag":125,"props":1034,"children":1035},{},[1036],{"type":47,"value":1037},"require 'msgpack'\n",{"type":42,"tag":125,"props":1039,"children":1040},{"class":127,"line":418},[1041],{"type":42,"tag":125,"props":1042,"children":1043},{},[1044],{"type":47,"value":670},{"type":42,"tag":125,"props":1046,"children":1047},{"class":127,"line":444},[1048],{"type":42,"tag":125,"props":1049,"children":1050},{"emptyLinePlaceholder":659},[1051],{"type":47,"value":662},{"type":42,"tag":125,"props":1053,"children":1054},{"class":127,"line":470},[1055],{"type":42,"tag":125,"props":1056,"children":1057},{},[1058],{"type":47,"value":876},{"type":42,"tag":125,"props":1060,"children":1061},{"class":127,"line":754},[1062],{"type":42,"tag":125,"props":1063,"children":1064},{},[1065],{"type":47,"value":1066},"  begin\n",{"type":42,"tag":125,"props":1068,"children":1069},{"class":127,"line":763},[1070],{"type":42,"tag":125,"props":1071,"children":1072},{},[1073],{"type":47,"value":1074},"    MessagePack.unpack(data)\n",{"type":42,"tag":125,"props":1076,"children":1077},{"class":127,"line":772},[1078],{"type":42,"tag":125,"props":1079,"children":1080},{},[1081],{"type":47,"value":1082},"  rescue Exception\n",{"type":42,"tag":125,"props":1084,"children":1085},{"class":127,"line":781},[1086],{"type":42,"tag":125,"props":1087,"children":1088},{},[1089],{"type":47,"value":1090},"    # We're looking for memory corruption, not Ruby exceptions\n",{"type":42,"tag":125,"props":1092,"children":1093},{"class":127,"line":790},[1094],{"type":42,"tag":125,"props":1095,"children":1096},{},[1097],{"type":47,"value":850},{"type":42,"tag":125,"props":1099,"children":1100},{"class":127,"line":799},[1101],{"type":42,"tag":125,"props":1102,"children":1103},{},[1104],{"type":47,"value":894},{"type":42,"tag":125,"props":1106,"children":1107},{"class":127,"line":808},[1108],{"type":42,"tag":125,"props":1109,"children":1110},{},[1111],{"type":47,"value":859},{"type":42,"tag":125,"props":1113,"children":1114},{"class":127,"line":817},[1115],{"type":42,"tag":125,"props":1116,"children":1117},{"emptyLinePlaceholder":659},[1118],{"type":47,"value":662},{"type":42,"tag":125,"props":1120,"children":1121},{"class":127,"line":826},[1122],{"type":42,"tag":125,"props":1123,"children":1124},{},[1125],{"type":47,"value":919},{"type":42,"tag":50,"props":1127,"children":1128},{},[1129],{"type":47,"value":924},{"type":42,"tag":113,"props":1131,"children":1133},{"className":115,"code":1132,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby fuzz_msgpack.rb\n",[1134],{"type":42,"tag":121,"props":1135,"children":1136},{"__ignoreMap":118},[1137,1176],{"type":42,"tag":125,"props":1138,"children":1139},{"class":127,"line":128},[1140,1144,1148,1152,1156,1160,1164,1168,1172],{"type":42,"tag":125,"props":1141,"children":1142},{"style":138},[1143],{"type":47,"value":183},{"type":42,"tag":125,"props":1145,"children":1146},{"style":144},[1147],{"type":47,"value":188},{"type":42,"tag":125,"props":1149,"children":1150},{"style":191},[1151],{"type":47,"value":22},{"type":42,"tag":125,"props":1153,"children":1154},{"style":155},[1155],{"type":47,"value":198},{"type":42,"tag":125,"props":1157,"children":1158},{"style":144},[1159],{"type":47,"value":203},{"type":42,"tag":125,"props":1161,"children":1162},{"style":155},[1163],{"type":47,"value":208},{"type":42,"tag":125,"props":1165,"children":1166},{"style":144},[1167],{"type":47,"value":213},{"type":42,"tag":125,"props":1169,"children":1170},{"style":144},[1171],{"type":47,"value":218},{"type":42,"tag":125,"props":1173,"children":1174},{"style":191},[1175],{"type":47,"value":223},{"type":42,"tag":125,"props":1177,"children":1178},{"class":127,"line":226},[1179,1183],{"type":42,"tag":125,"props":1180,"children":1181},{"style":155},[1182],{"type":47,"value":232},{"type":42,"tag":125,"props":1184,"children":1185},{"style":155},[1186],{"type":47,"value":1187}," fuzz_msgpack.rb\n",{"type":42,"tag":263,"props":1189,"children":1191},{"id":1190},"harness-rules",[1192],{"type":47,"value":1193},"Harness Rules",{"type":42,"tag":1195,"props":1196,"children":1197},"table",{},[1198,1217],{"type":42,"tag":1199,"props":1200,"children":1201},"thead",{},[1202],{"type":42,"tag":1203,"props":1204,"children":1205},"tr",{},[1206,1212],{"type":42,"tag":1207,"props":1208,"children":1209},"th",{},[1210],{"type":47,"value":1211},"Do",{"type":42,"tag":1207,"props":1213,"children":1214},{},[1215],{"type":47,"value":1216},"Don't",{"type":42,"tag":1218,"props":1219,"children":1220},"tbody",{},[1221,1235,1248,1261],{"type":42,"tag":1203,"props":1222,"children":1223},{},[1224,1230],{"type":42,"tag":1225,"props":1226,"children":1227},"td",{},[1228],{"type":47,"value":1229},"Catch Ruby exceptions if testing C extensions",{"type":42,"tag":1225,"props":1231,"children":1232},{},[1233],{"type":47,"value":1234},"Let Ruby exceptions crash the fuzzer",{"type":42,"tag":1203,"props":1236,"children":1237},{},[1238,1243],{"type":42,"tag":1225,"props":1239,"children":1240},{},[1241],{"type":47,"value":1242},"Return 0 from test_one_input lambda",{"type":42,"tag":1225,"props":1244,"children":1245},{},[1246],{"type":47,"value":1247},"Return other values",{"type":42,"tag":1203,"props":1249,"children":1250},{},[1251,1256],{"type":42,"tag":1225,"props":1252,"children":1253},{},[1254],{"type":47,"value":1255},"Keep harness deterministic",{"type":42,"tag":1225,"props":1257,"children":1258},{},[1259],{"type":47,"value":1260},"Use randomness or time-based logic",{"type":42,"tag":1203,"props":1262,"children":1263},{},[1264,1269],{"type":42,"tag":1225,"props":1265,"children":1266},{},[1267],{"type":47,"value":1268},"Use tracer script for pure Ruby",{"type":42,"tag":1225,"props":1270,"children":1271},{},[1272],{"type":47,"value":1273},"Skip tracer for pure Ruby code",{"type":42,"tag":1275,"props":1276,"children":1277},"blockquote",{},[1278],{"type":42,"tag":50,"props":1279,"children":1280},{},[1281,1286,1288,1293],{"type":42,"tag":71,"props":1282,"children":1283},{},[1284],{"type":47,"value":1285},"See Also:",{"type":47,"value":1287}," For detailed harness writing techniques, patterns for handling complex inputs,\nand advanced strategies, see the ",{"type":42,"tag":71,"props":1289,"children":1290},{},[1291],{"type":47,"value":1292},"fuzz-harness-writing",{"type":47,"value":1294}," technique skill.",{"type":42,"tag":56,"props":1296,"children":1298},{"id":1297},"compilation",[1299],{"type":47,"value":1300},"Compilation",{"type":42,"tag":263,"props":1302,"children":1304},{"id":1303},"installing-gems-with-sanitizers",[1305],{"type":47,"value":1306},"Installing Gems with Sanitizers",{"type":42,"tag":50,"props":1308,"children":1309},{},[1310],{"type":47,"value":1311},"When installing Ruby gems with C extensions for fuzzing, compile with sanitizer flags:",{"type":42,"tag":113,"props":1313,"children":1315},{"className":115,"code":1314,"language":117,"meta":118,"style":118},"MAKE=\"make --environment-overrides V=1\" \\\nCC=\"\u002Fpath\u002Fto\u002Fclang\" \\\nCXX=\"\u002Fpath\u002Fto\u002Fclang++\" \\\nLDSHARED=\"\u002Fpath\u002Fto\u002Fclang -shared\" \\\nLDSHAREDXX=\"\u002Fpath\u002Fto\u002Fclang++ -shared\" \\\nCFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\nCXXFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\n    gem install \u003Cgem-name>\n",[1316],{"type":42,"tag":121,"props":1317,"children":1318},{"__ignoreMap":118},[1319,1346,1369,1392,1415,1438,1463,1487],{"type":42,"tag":125,"props":1320,"children":1321},{"class":127,"line":128},[1322,1326,1330,1334,1338,1342],{"type":42,"tag":125,"props":1323,"children":1324},{"style":138},[1325],{"type":47,"value":343},{"type":42,"tag":125,"props":1327,"children":1328},{"style":144},[1329],{"type":47,"value":147},{"type":42,"tag":125,"props":1331,"children":1332},{"style":144},[1333],{"type":47,"value":152},{"type":42,"tag":125,"props":1335,"children":1336},{"style":155},[1337],{"type":47,"value":356},{"type":42,"tag":125,"props":1339,"children":1340},{"style":144},[1341],{"type":47,"value":152},{"type":42,"tag":125,"props":1343,"children":1344},{"style":191},[1345],{"type":47,"value":223},{"type":42,"tag":125,"props":1347,"children":1348},{"class":127,"line":226},[1349,1353,1357,1361,1365],{"type":42,"tag":125,"props":1350,"children":1351},{"style":138},[1352],{"type":47,"value":372},{"type":42,"tag":125,"props":1354,"children":1355},{"style":144},[1356],{"type":47,"value":152},{"type":42,"tag":125,"props":1358,"children":1359},{"style":155},[1360],{"type":47,"value":381},{"type":42,"tag":125,"props":1362,"children":1363},{"style":144},[1364],{"type":47,"value":152},{"type":42,"tag":125,"props":1366,"children":1367},{"style":138},[1368],{"type":47,"value":223},{"type":42,"tag":125,"props":1370,"children":1371},{"class":127,"line":392},[1372,1376,1380,1384,1388],{"type":42,"tag":125,"props":1373,"children":1374},{"style":138},[1375],{"type":47,"value":398},{"type":42,"tag":125,"props":1377,"children":1378},{"style":144},[1379],{"type":47,"value":152},{"type":42,"tag":125,"props":1381,"children":1382},{"style":155},[1383],{"type":47,"value":407},{"type":42,"tag":125,"props":1385,"children":1386},{"style":144},[1387],{"type":47,"value":152},{"type":42,"tag":125,"props":1389,"children":1390},{"style":138},[1391],{"type":47,"value":223},{"type":42,"tag":125,"props":1393,"children":1394},{"class":127,"line":418},[1395,1399,1403,1407,1411],{"type":42,"tag":125,"props":1396,"children":1397},{"style":138},[1398],{"type":47,"value":424},{"type":42,"tag":125,"props":1400,"children":1401},{"style":144},[1402],{"type":47,"value":152},{"type":42,"tag":125,"props":1404,"children":1405},{"style":155},[1406],{"type":47,"value":433},{"type":42,"tag":125,"props":1408,"children":1409},{"style":144},[1410],{"type":47,"value":152},{"type":42,"tag":125,"props":1412,"children":1413},{"style":138},[1414],{"type":47,"value":223},{"type":42,"tag":125,"props":1416,"children":1417},{"class":127,"line":444},[1418,1422,1426,1430,1434],{"type":42,"tag":125,"props":1419,"children":1420},{"style":138},[1421],{"type":47,"value":450},{"type":42,"tag":125,"props":1423,"children":1424},{"style":144},[1425],{"type":47,"value":152},{"type":42,"tag":125,"props":1427,"children":1428},{"style":155},[1429],{"type":47,"value":459},{"type":42,"tag":125,"props":1431,"children":1432},{"style":144},[1433],{"type":47,"value":152},{"type":42,"tag":125,"props":1435,"children":1436},{"style":138},[1437],{"type":47,"value":223},{"type":42,"tag":125,"props":1439,"children":1440},{"class":127,"line":470},[1441,1446,1450,1455,1459],{"type":42,"tag":125,"props":1442,"children":1443},{"style":138},[1444],{"type":47,"value":1445},"CFLAGS=",{"type":42,"tag":125,"props":1447,"children":1448},{"style":144},[1449],{"type":47,"value":152},{"type":42,"tag":125,"props":1451,"children":1452},{"style":155},[1453],{"type":47,"value":1454},"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g",{"type":42,"tag":125,"props":1456,"children":1457},{"style":144},[1458],{"type":47,"value":152},{"type":42,"tag":125,"props":1460,"children":1461},{"style":138},[1462],{"type":47,"value":223},{"type":42,"tag":125,"props":1464,"children":1465},{"class":127,"line":754},[1466,1471,1475,1479,1483],{"type":42,"tag":125,"props":1467,"children":1468},{"style":138},[1469],{"type":47,"value":1470},"CXXFLAGS=",{"type":42,"tag":125,"props":1472,"children":1473},{"style":144},[1474],{"type":47,"value":152},{"type":42,"tag":125,"props":1476,"children":1477},{"style":155},[1478],{"type":47,"value":1454},{"type":42,"tag":125,"props":1480,"children":1481},{"style":144},[1482],{"type":47,"value":152},{"type":42,"tag":125,"props":1484,"children":1485},{"style":138},[1486],{"type":47,"value":223},{"type":42,"tag":125,"props":1488,"children":1489},{"class":127,"line":763},[1490,1494,1498,1503,1508,1513],{"type":42,"tag":125,"props":1491,"children":1492},{"style":155},[1493],{"type":47,"value":476},{"type":42,"tag":125,"props":1495,"children":1496},{"style":155},[1497],{"type":47,"value":481},{"type":42,"tag":125,"props":1499,"children":1500},{"style":144},[1501],{"type":47,"value":1502}," \u003C",{"type":42,"tag":125,"props":1504,"children":1505},{"style":155},[1506],{"type":47,"value":1507},"gem-nam",{"type":42,"tag":125,"props":1509,"children":1510},{"style":138},[1511],{"type":47,"value":1512},"e",{"type":42,"tag":125,"props":1514,"children":1515},{"style":144},[1516],{"type":47,"value":1517},">\n",{"type":42,"tag":263,"props":1519,"children":1521},{"id":1520},"build-flags",[1522],{"type":47,"value":1523},"Build Flags",{"type":42,"tag":1195,"props":1525,"children":1526},{},[1527,1543],{"type":42,"tag":1199,"props":1528,"children":1529},{},[1530],{"type":42,"tag":1203,"props":1531,"children":1532},{},[1533,1538],{"type":42,"tag":1207,"props":1534,"children":1535},{},[1536],{"type":47,"value":1537},"Flag",{"type":42,"tag":1207,"props":1539,"children":1540},{},[1541],{"type":47,"value":1542},"Purpose",{"type":42,"tag":1218,"props":1544,"children":1545},{},[1546,1563,1580,1597,1614],{"type":42,"tag":1203,"props":1547,"children":1548},{},[1549,1558],{"type":42,"tag":1225,"props":1550,"children":1551},{},[1552],{"type":42,"tag":121,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":47,"value":1557},"-fsanitize=address,fuzzer-no-link",{"type":42,"tag":1225,"props":1559,"children":1560},{},[1561],{"type":47,"value":1562},"Enable AddressSanitizer and fuzzer instrumentation",{"type":42,"tag":1203,"props":1564,"children":1565},{},[1566,1575],{"type":42,"tag":1225,"props":1567,"children":1568},{},[1569],{"type":42,"tag":121,"props":1570,"children":1572},{"className":1571},[],[1573],{"type":47,"value":1574},"-fno-omit-frame-pointer",{"type":42,"tag":1225,"props":1576,"children":1577},{},[1578],{"type":47,"value":1579},"Improve stack trace quality",{"type":42,"tag":1203,"props":1581,"children":1582},{},[1583,1592],{"type":42,"tag":1225,"props":1584,"children":1585},{},[1586],{"type":42,"tag":121,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":47,"value":1591},"-fno-common",{"type":42,"tag":1225,"props":1593,"children":1594},{},[1595],{"type":47,"value":1596},"Better compatibility with sanitizers",{"type":42,"tag":1203,"props":1598,"children":1599},{},[1600,1609],{"type":42,"tag":1225,"props":1601,"children":1602},{},[1603],{"type":42,"tag":121,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":47,"value":1608},"-fPIC",{"type":42,"tag":1225,"props":1610,"children":1611},{},[1612],{"type":47,"value":1613},"Position-independent code for shared libraries",{"type":42,"tag":1203,"props":1615,"children":1616},{},[1617,1626],{"type":42,"tag":1225,"props":1618,"children":1619},{},[1620],{"type":42,"tag":121,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":47,"value":1625},"-g",{"type":42,"tag":1225,"props":1627,"children":1628},{},[1629],{"type":47,"value":1630},"Include debug symbols",{"type":42,"tag":56,"props":1632,"children":1634},{"id":1633},"running-campaigns",[1635],{"type":47,"value":1636},"Running Campaigns",{"type":42,"tag":263,"props":1638,"children":1640},{"id":1639},"environment-setup",[1641],{"type":47,"value":1642},"Environment Setup",{"type":42,"tag":50,"props":1644,"children":1645},{},[1646],{"type":47,"value":1647},"Before running any fuzzing campaign, set ASAN_OPTIONS:",{"type":42,"tag":113,"props":1649,"children":1650},{"className":115,"code":116,"language":117,"meta":118,"style":118},[1651],{"type":42,"tag":121,"props":1652,"children":1653},{"__ignoreMap":118},[1654],{"type":42,"tag":125,"props":1655,"children":1656},{"class":127,"line":128},[1657,1661,1665,1669,1673,1677],{"type":42,"tag":125,"props":1658,"children":1659},{"style":132},[1660],{"type":47,"value":135},{"type":42,"tag":125,"props":1662,"children":1663},{"style":138},[1664],{"type":47,"value":141},{"type":42,"tag":125,"props":1666,"children":1667},{"style":144},[1668],{"type":47,"value":147},{"type":42,"tag":125,"props":1670,"children":1671},{"style":144},[1672],{"type":47,"value":152},{"type":42,"tag":125,"props":1674,"children":1675},{"style":155},[1676],{"type":47,"value":158},{"type":42,"tag":125,"props":1678,"children":1679},{"style":144},[1680],{"type":47,"value":163},{"type":42,"tag":50,"props":1682,"children":1683},{},[1684],{"type":42,"tag":71,"props":1685,"children":1686},{},[1687],{"type":47,"value":1688},"Options explained:",{"type":42,"tag":1690,"props":1691,"children":1692},"ol",{},[1693,1704,1715],{"type":42,"tag":81,"props":1694,"children":1695},{},[1696,1702],{"type":42,"tag":121,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":47,"value":1701},"allocator_may_return_null=1",{"type":47,"value":1703},": Skip common low-impact allocation failures (DoS)",{"type":42,"tag":81,"props":1705,"children":1706},{},[1707,1713],{"type":42,"tag":121,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":47,"value":1712},"detect_leaks=0",{"type":47,"value":1714},": Ruby interpreter leaks data, ignore these for now",{"type":42,"tag":81,"props":1716,"children":1717},{},[1718,1724],{"type":42,"tag":121,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":47,"value":1723},"use_sigaltstack=0",{"type":47,"value":1725},": Ruby recommends disabling sigaltstack with ASan",{"type":42,"tag":263,"props":1727,"children":1729},{"id":1728},"basic-run",[1730],{"type":47,"value":1731},"Basic Run",{"type":42,"tag":113,"props":1733,"children":1735},{"className":115,"code":1734,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb\n",[1736],{"type":42,"tag":121,"props":1737,"children":1738},{"__ignoreMap":118},[1739,1778],{"type":42,"tag":125,"props":1740,"children":1741},{"class":127,"line":128},[1742,1746,1750,1754,1758,1762,1766,1770,1774],{"type":42,"tag":125,"props":1743,"children":1744},{"style":138},[1745],{"type":47,"value":183},{"type":42,"tag":125,"props":1747,"children":1748},{"style":144},[1749],{"type":47,"value":188},{"type":42,"tag":125,"props":1751,"children":1752},{"style":191},[1753],{"type":47,"value":22},{"type":42,"tag":125,"props":1755,"children":1756},{"style":155},[1757],{"type":47,"value":198},{"type":42,"tag":125,"props":1759,"children":1760},{"style":144},[1761],{"type":47,"value":203},{"type":42,"tag":125,"props":1763,"children":1764},{"style":155},[1765],{"type":47,"value":208},{"type":42,"tag":125,"props":1767,"children":1768},{"style":144},[1769],{"type":47,"value":213},{"type":42,"tag":125,"props":1771,"children":1772},{"style":144},[1773],{"type":47,"value":218},{"type":42,"tag":125,"props":1775,"children":1776},{"style":191},[1777],{"type":47,"value":223},{"type":42,"tag":125,"props":1779,"children":1780},{"class":127,"line":226},[1781,1785],{"type":42,"tag":125,"props":1782,"children":1783},{"style":155},[1784],{"type":47,"value":232},{"type":42,"tag":125,"props":1786,"children":1787},{"style":155},[1788],{"type":47,"value":1789}," harness.rb\n",{"type":42,"tag":50,"props":1791,"children":1792},{},[1793,1798,1800,1805,1807,1813],{"type":42,"tag":71,"props":1794,"children":1795},{},[1796],{"type":47,"value":1797},"Note:",{"type":47,"value":1799}," ",{"type":42,"tag":121,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":47,"value":183},{"type":47,"value":1806}," is required for sanitizer injection. Unlike ",{"type":42,"tag":121,"props":1808,"children":1810},{"className":1809},[],[1811],{"type":47,"value":1812},"ASAN_OPTIONS",{"type":47,"value":1814},", do not export it as it may interfere with other programs.",{"type":42,"tag":263,"props":1816,"children":1818},{"id":1817},"with-corpus",[1819],{"type":47,"value":1820},"With Corpus",{"type":42,"tag":113,"props":1822,"children":1824},{"className":115,"code":1823,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb \u002Fpath\u002Fto\u002Fcorpus\n",[1825],{"type":42,"tag":121,"props":1826,"children":1827},{"__ignoreMap":118},[1828,1867],{"type":42,"tag":125,"props":1829,"children":1830},{"class":127,"line":128},[1831,1835,1839,1843,1847,1851,1855,1859,1863],{"type":42,"tag":125,"props":1832,"children":1833},{"style":138},[1834],{"type":47,"value":183},{"type":42,"tag":125,"props":1836,"children":1837},{"style":144},[1838],{"type":47,"value":188},{"type":42,"tag":125,"props":1840,"children":1841},{"style":191},[1842],{"type":47,"value":22},{"type":42,"tag":125,"props":1844,"children":1845},{"style":155},[1846],{"type":47,"value":198},{"type":42,"tag":125,"props":1848,"children":1849},{"style":144},[1850],{"type":47,"value":203},{"type":42,"tag":125,"props":1852,"children":1853},{"style":155},[1854],{"type":47,"value":208},{"type":42,"tag":125,"props":1856,"children":1857},{"style":144},[1858],{"type":47,"value":213},{"type":42,"tag":125,"props":1860,"children":1861},{"style":144},[1862],{"type":47,"value":218},{"type":42,"tag":125,"props":1864,"children":1865},{"style":191},[1866],{"type":47,"value":223},{"type":42,"tag":125,"props":1868,"children":1869},{"class":127,"line":226},[1870,1874,1879],{"type":42,"tag":125,"props":1871,"children":1872},{"style":155},[1873],{"type":47,"value":232},{"type":42,"tag":125,"props":1875,"children":1876},{"style":155},[1877],{"type":47,"value":1878}," harness.rb",{"type":42,"tag":125,"props":1880,"children":1881},{"style":155},[1882],{"type":47,"value":1883}," \u002Fpath\u002Fto\u002Fcorpus\n",{"type":42,"tag":263,"props":1885,"children":1887},{"id":1886},"passing-libfuzzer-options",[1888],{"type":47,"value":1889},"Passing libFuzzer Options",{"type":42,"tag":50,"props":1891,"children":1892},{},[1893],{"type":47,"value":1894},"All libFuzzer options can be passed as arguments:",{"type":42,"tag":113,"props":1896,"children":1898},{"className":115,"code":1897,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb \u002Fpath\u002Fto\u002Fcorpus -max_len=1024 -timeout=10\n",[1899],{"type":42,"tag":121,"props":1900,"children":1901},{"__ignoreMap":118},[1902,1941],{"type":42,"tag":125,"props":1903,"children":1904},{"class":127,"line":128},[1905,1909,1913,1917,1921,1925,1929,1933,1937],{"type":42,"tag":125,"props":1906,"children":1907},{"style":138},[1908],{"type":47,"value":183},{"type":42,"tag":125,"props":1910,"children":1911},{"style":144},[1912],{"type":47,"value":188},{"type":42,"tag":125,"props":1914,"children":1915},{"style":191},[1916],{"type":47,"value":22},{"type":42,"tag":125,"props":1918,"children":1919},{"style":155},[1920],{"type":47,"value":198},{"type":42,"tag":125,"props":1922,"children":1923},{"style":144},[1924],{"type":47,"value":203},{"type":42,"tag":125,"props":1926,"children":1927},{"style":155},[1928],{"type":47,"value":208},{"type":42,"tag":125,"props":1930,"children":1931},{"style":144},[1932],{"type":47,"value":213},{"type":42,"tag":125,"props":1934,"children":1935},{"style":144},[1936],{"type":47,"value":218},{"type":42,"tag":125,"props":1938,"children":1939},{"style":191},[1940],{"type":47,"value":223},{"type":42,"tag":125,"props":1942,"children":1943},{"class":127,"line":226},[1944,1948,1952,1957,1962],{"type":42,"tag":125,"props":1945,"children":1946},{"style":155},[1947],{"type":47,"value":232},{"type":42,"tag":125,"props":1949,"children":1950},{"style":155},[1951],{"type":47,"value":1878},{"type":42,"tag":125,"props":1953,"children":1954},{"style":155},[1955],{"type":47,"value":1956}," \u002Fpath\u002Fto\u002Fcorpus",{"type":42,"tag":125,"props":1958,"children":1959},{"style":155},[1960],{"type":47,"value":1961}," -max_len=1024",{"type":42,"tag":125,"props":1963,"children":1964},{"style":155},[1965],{"type":47,"value":1966}," -timeout=10\n",{"type":42,"tag":50,"props":1968,"children":1969},{},[1970,1972,1979],{"type":47,"value":1971},"See ",{"type":42,"tag":275,"props":1973,"children":1976},{"href":1974,"rel":1975},"https:\u002F\u002Fllvm.org\u002Fdocs\u002FLibFuzzer.html#options",[279],[1977],{"type":47,"value":1978},"libFuzzer options",{"type":47,"value":1980}," for full reference.",{"type":42,"tag":263,"props":1982,"children":1984},{"id":1983},"reproducing-crashes",[1985],{"type":47,"value":1986},"Reproducing Crashes",{"type":42,"tag":50,"props":1988,"children":1989},{},[1990],{"type":47,"value":1991},"Re-run a crash case by passing the crash file:",{"type":42,"tag":113,"props":1993,"children":1995},{"className":115,"code":1994,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby harness.rb .\u002Fcrash-253420c1158bc6382093d409ce2e9cff5806e980\n",[1996],{"type":42,"tag":121,"props":1997,"children":1998},{"__ignoreMap":118},[1999,2038],{"type":42,"tag":125,"props":2000,"children":2001},{"class":127,"line":128},[2002,2006,2010,2014,2018,2022,2026,2030,2034],{"type":42,"tag":125,"props":2003,"children":2004},{"style":138},[2005],{"type":47,"value":183},{"type":42,"tag":125,"props":2007,"children":2008},{"style":144},[2009],{"type":47,"value":188},{"type":42,"tag":125,"props":2011,"children":2012},{"style":191},[2013],{"type":47,"value":22},{"type":42,"tag":125,"props":2015,"children":2016},{"style":155},[2017],{"type":47,"value":198},{"type":42,"tag":125,"props":2019,"children":2020},{"style":144},[2021],{"type":47,"value":203},{"type":42,"tag":125,"props":2023,"children":2024},{"style":155},[2025],{"type":47,"value":208},{"type":42,"tag":125,"props":2027,"children":2028},{"style":144},[2029],{"type":47,"value":213},{"type":42,"tag":125,"props":2031,"children":2032},{"style":144},[2033],{"type":47,"value":218},{"type":42,"tag":125,"props":2035,"children":2036},{"style":191},[2037],{"type":47,"value":223},{"type":42,"tag":125,"props":2039,"children":2040},{"class":127,"line":226},[2041,2045,2049],{"type":42,"tag":125,"props":2042,"children":2043},{"style":155},[2044],{"type":47,"value":232},{"type":42,"tag":125,"props":2046,"children":2047},{"style":155},[2048],{"type":47,"value":1878},{"type":42,"tag":125,"props":2050,"children":2051},{"style":155},[2052],{"type":47,"value":2053}," .\u002Fcrash-253420c1158bc6382093d409ce2e9cff5806e980\n",{"type":42,"tag":263,"props":2055,"children":2057},{"id":2056},"interpreting-output",[2058],{"type":47,"value":2059},"Interpreting Output",{"type":42,"tag":1195,"props":2061,"children":2062},{},[2063,2079],{"type":42,"tag":1199,"props":2064,"children":2065},{},[2066],{"type":42,"tag":1203,"props":2067,"children":2068},{},[2069,2074],{"type":42,"tag":1207,"props":2070,"children":2071},{},[2072],{"type":47,"value":2073},"Output",{"type":42,"tag":1207,"props":2075,"children":2076},{},[2077],{"type":47,"value":2078},"Meaning",{"type":42,"tag":1218,"props":2080,"children":2081},{},[2082,2099,2116,2133,2150],{"type":42,"tag":1203,"props":2083,"children":2084},{},[2085,2094],{"type":42,"tag":1225,"props":2086,"children":2087},{},[2088],{"type":42,"tag":121,"props":2089,"children":2091},{"className":2090},[],[2092],{"type":47,"value":2093},"INFO: Running with entropic power schedule",{"type":42,"tag":1225,"props":2095,"children":2096},{},[2097],{"type":47,"value":2098},"Fuzzing campaign started",{"type":42,"tag":1203,"props":2100,"children":2101},{},[2102,2111],{"type":42,"tag":1225,"props":2103,"children":2104},{},[2105],{"type":42,"tag":121,"props":2106,"children":2108},{"className":2107},[],[2109],{"type":47,"value":2110},"ERROR: AddressSanitizer: heap-use-after-free",{"type":42,"tag":1225,"props":2112,"children":2113},{},[2114],{"type":47,"value":2115},"Memory corruption detected",{"type":42,"tag":1203,"props":2117,"children":2118},{},[2119,2128],{"type":42,"tag":1225,"props":2120,"children":2121},{},[2122],{"type":42,"tag":121,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":47,"value":2127},"SUMMARY: libFuzzer: fuzz target exited",{"type":42,"tag":1225,"props":2129,"children":2130},{},[2131],{"type":47,"value":2132},"Ruby exception occurred",{"type":42,"tag":1203,"props":2134,"children":2135},{},[2136,2145],{"type":42,"tag":1225,"props":2137,"children":2138},{},[2139],{"type":42,"tag":121,"props":2140,"children":2142},{"className":2141},[],[2143],{"type":47,"value":2144},"artifact_prefix='.\u002F'; Test unit written to .\u002Fcrash-*",{"type":42,"tag":1225,"props":2146,"children":2147},{},[2148],{"type":47,"value":2149},"Crash input saved",{"type":42,"tag":1203,"props":2151,"children":2152},{},[2153,2162],{"type":42,"tag":1225,"props":2154,"children":2155},{},[2156],{"type":42,"tag":121,"props":2157,"children":2159},{"className":2158},[],[2160],{"type":47,"value":2161},"Base64: ...",{"type":42,"tag":1225,"props":2163,"children":2164},{},[2165],{"type":47,"value":2166},"Base64 encoding of crash input",{"type":42,"tag":56,"props":2168,"children":2170},{"id":2169},"sanitizer-integration",[2171],{"type":47,"value":2172},"Sanitizer Integration",{"type":42,"tag":263,"props":2174,"children":2176},{"id":2175},"addresssanitizer-asan",[2177],{"type":47,"value":2178},"AddressSanitizer (ASan)",{"type":42,"tag":50,"props":2180,"children":2181},{},[2182],{"type":47,"value":2183},"Ruzzy includes a pre-compiled AddressSanitizer library:",{"type":42,"tag":113,"props":2185,"children":2186},{"className":115,"code":1734,"language":117,"meta":118,"style":118},[2187],{"type":42,"tag":121,"props":2188,"children":2189},{"__ignoreMap":118},[2190,2229],{"type":42,"tag":125,"props":2191,"children":2192},{"class":127,"line":128},[2193,2197,2201,2205,2209,2213,2217,2221,2225],{"type":42,"tag":125,"props":2194,"children":2195},{"style":138},[2196],{"type":47,"value":183},{"type":42,"tag":125,"props":2198,"children":2199},{"style":144},[2200],{"type":47,"value":188},{"type":42,"tag":125,"props":2202,"children":2203},{"style":191},[2204],{"type":47,"value":22},{"type":42,"tag":125,"props":2206,"children":2207},{"style":155},[2208],{"type":47,"value":198},{"type":42,"tag":125,"props":2210,"children":2211},{"style":144},[2212],{"type":47,"value":203},{"type":42,"tag":125,"props":2214,"children":2215},{"style":155},[2216],{"type":47,"value":208},{"type":42,"tag":125,"props":2218,"children":2219},{"style":144},[2220],{"type":47,"value":213},{"type":42,"tag":125,"props":2222,"children":2223},{"style":144},[2224],{"type":47,"value":218},{"type":42,"tag":125,"props":2226,"children":2227},{"style":191},[2228],{"type":47,"value":223},{"type":42,"tag":125,"props":2230,"children":2231},{"class":127,"line":226},[2232,2236],{"type":42,"tag":125,"props":2233,"children":2234},{"style":155},[2235],{"type":47,"value":232},{"type":42,"tag":125,"props":2237,"children":2238},{"style":155},[2239],{"type":47,"value":1789},{"type":42,"tag":50,"props":2241,"children":2242},{},[2243],{"type":47,"value":2244},"Use ASan for detecting:",{"type":42,"tag":77,"props":2246,"children":2247},{},[2248,2253,2258,2263,2268],{"type":42,"tag":81,"props":2249,"children":2250},{},[2251],{"type":47,"value":2252},"Heap buffer overflows",{"type":42,"tag":81,"props":2254,"children":2255},{},[2256],{"type":47,"value":2257},"Stack buffer overflows",{"type":42,"tag":81,"props":2259,"children":2260},{},[2261],{"type":47,"value":2262},"Use-after-free",{"type":42,"tag":81,"props":2264,"children":2265},{},[2266],{"type":47,"value":2267},"Double-free",{"type":42,"tag":81,"props":2269,"children":2270},{},[2271],{"type":47,"value":2272},"Memory leaks (disabled by default in Ruzzy)",{"type":42,"tag":263,"props":2274,"children":2276},{"id":2275},"undefinedbehaviorsanitizer-ubsan",[2277],{"type":47,"value":2278},"UndefinedBehaviorSanitizer (UBSan)",{"type":42,"tag":50,"props":2280,"children":2281},{},[2282],{"type":47,"value":2283},"Ruzzy also includes UBSan:",{"type":42,"tag":113,"props":2285,"children":2287},{"className":115,"code":2286,"language":117,"meta":118,"style":118},"LD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::UBSAN_PATH') \\\n    ruby harness.rb\n",[2288],{"type":42,"tag":121,"props":2289,"children":2290},{"__ignoreMap":118},[2291,2331],{"type":42,"tag":125,"props":2292,"children":2293},{"class":127,"line":128},[2294,2298,2302,2306,2310,2314,2319,2323,2327],{"type":42,"tag":125,"props":2295,"children":2296},{"style":138},[2297],{"type":47,"value":183},{"type":42,"tag":125,"props":2299,"children":2300},{"style":144},[2301],{"type":47,"value":188},{"type":42,"tag":125,"props":2303,"children":2304},{"style":191},[2305],{"type":47,"value":22},{"type":42,"tag":125,"props":2307,"children":2308},{"style":155},[2309],{"type":47,"value":198},{"type":42,"tag":125,"props":2311,"children":2312},{"style":144},[2313],{"type":47,"value":203},{"type":42,"tag":125,"props":2315,"children":2316},{"style":155},[2317],{"type":47,"value":2318},"require \"ruzzy\"; print Ruzzy::UBSAN_PATH",{"type":42,"tag":125,"props":2320,"children":2321},{"style":144},[2322],{"type":47,"value":213},{"type":42,"tag":125,"props":2324,"children":2325},{"style":144},[2326],{"type":47,"value":218},{"type":42,"tag":125,"props":2328,"children":2329},{"style":191},[2330],{"type":47,"value":223},{"type":42,"tag":125,"props":2332,"children":2333},{"class":127,"line":226},[2334,2338],{"type":42,"tag":125,"props":2335,"children":2336},{"style":155},[2337],{"type":47,"value":232},{"type":42,"tag":125,"props":2339,"children":2340},{"style":155},[2341],{"type":47,"value":1789},{"type":42,"tag":50,"props":2343,"children":2344},{},[2345],{"type":47,"value":2346},"Use UBSan for detecting:",{"type":42,"tag":77,"props":2348,"children":2349},{},[2350,2355,2360,2365],{"type":42,"tag":81,"props":2351,"children":2352},{},[2353],{"type":47,"value":2354},"Signed integer overflow",{"type":42,"tag":81,"props":2356,"children":2357},{},[2358],{"type":47,"value":2359},"Null pointer dereferences",{"type":42,"tag":81,"props":2361,"children":2362},{},[2363],{"type":47,"value":2364},"Misaligned memory access",{"type":42,"tag":81,"props":2366,"children":2367},{},[2368],{"type":47,"value":2369},"Division by zero",{"type":42,"tag":263,"props":2371,"children":2373},{"id":2372},"common-sanitizer-issues",[2374],{"type":47,"value":2375},"Common Sanitizer Issues",{"type":42,"tag":1195,"props":2377,"children":2378},{},[2379,2395],{"type":42,"tag":1199,"props":2380,"children":2381},{},[2382],{"type":42,"tag":1203,"props":2383,"children":2384},{},[2385,2390],{"type":42,"tag":1207,"props":2386,"children":2387},{},[2388],{"type":47,"value":2389},"Issue",{"type":42,"tag":1207,"props":2391,"children":2392},{},[2393],{"type":47,"value":2394},"Solution",{"type":42,"tag":1218,"props":2396,"children":2397},{},[2398,2417,2435,2453],{"type":42,"tag":1203,"props":2399,"children":2400},{},[2401,2406],{"type":42,"tag":1225,"props":2402,"children":2403},{},[2404],{"type":47,"value":2405},"Ruby interpreter leak warnings",{"type":42,"tag":1225,"props":2407,"children":2408},{},[2409,2411],{"type":47,"value":2410},"Use ",{"type":42,"tag":121,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":47,"value":2416},"ASAN_OPTIONS=detect_leaks=0",{"type":42,"tag":1203,"props":2418,"children":2419},{},[2420,2425],{"type":42,"tag":1225,"props":2421,"children":2422},{},[2423],{"type":47,"value":2424},"Sigaltstack conflicts",{"type":42,"tag":1225,"props":2426,"children":2427},{},[2428,2429],{"type":47,"value":2410},{"type":42,"tag":121,"props":2430,"children":2432},{"className":2431},[],[2433],{"type":47,"value":2434},"ASAN_OPTIONS=use_sigaltstack=0",{"type":42,"tag":1203,"props":2436,"children":2437},{},[2438,2443],{"type":42,"tag":1225,"props":2439,"children":2440},{},[2441],{"type":47,"value":2442},"Allocation failure spam",{"type":42,"tag":1225,"props":2444,"children":2445},{},[2446,2447],{"type":47,"value":2410},{"type":42,"tag":121,"props":2448,"children":2450},{"className":2449},[],[2451],{"type":47,"value":2452},"ASAN_OPTIONS=allocator_may_return_null=1",{"type":42,"tag":1203,"props":2454,"children":2455},{},[2456,2461],{"type":42,"tag":1225,"props":2457,"children":2458},{},[2459],{"type":47,"value":2460},"LD_PRELOAD interferes with tools",{"type":42,"tag":1225,"props":2462,"children":2463},{},[2464],{"type":47,"value":2465},"Don't export it; set inline with ruby command",{"type":42,"tag":1275,"props":2467,"children":2468},{},[2469],{"type":42,"tag":50,"props":2470,"children":2471},{},[2472,2476,2478,2483,2485,2490],{"type":42,"tag":71,"props":2473,"children":2474},{},[2475],{"type":47,"value":1285},{"type":47,"value":2477}," For detailed sanitizer configuration, common issues, and advanced flags,\nsee the ",{"type":42,"tag":71,"props":2479,"children":2480},{},[2481],{"type":47,"value":2482},"address-sanitizer",{"type":47,"value":2484}," and ",{"type":42,"tag":71,"props":2486,"children":2487},{},[2488],{"type":47,"value":2489},"undefined-behavior-sanitizer",{"type":47,"value":2491}," technique skills.",{"type":42,"tag":56,"props":2493,"children":2495},{"id":2494},"real-world-examples",[2496],{"type":47,"value":2497},"Real-World Examples",{"type":42,"tag":263,"props":2499,"children":2501},{"id":2500},"example-msgpack-ruby",[2502],{"type":47,"value":2503},"Example: msgpack-ruby",{"type":42,"tag":50,"props":2505,"children":2506},{},[2507],{"type":47,"value":2508},"Fuzzing the msgpack MessagePack parser for memory corruption.",{"type":42,"tag":50,"props":2510,"children":2511},{},[2512],{"type":42,"tag":71,"props":2513,"children":2514},{},[2515],{"type":47,"value":2516},"Install with sanitizers:",{"type":42,"tag":113,"props":2518,"children":2520},{"className":115,"code":2519,"language":117,"meta":118,"style":118},"MAKE=\"make --environment-overrides V=1\" \\\nCC=\"\u002Fpath\u002Fto\u002Fclang\" \\\nCXX=\"\u002Fpath\u002Fto\u002Fclang++\" \\\nLDSHARED=\"\u002Fpath\u002Fto\u002Fclang -shared\" \\\nLDSHAREDXX=\"\u002Fpath\u002Fto\u002Fclang++ -shared\" \\\nCFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\nCXXFLAGS=\"-fsanitize=address,fuzzer-no-link -fno-omit-frame-pointer -fno-common -fPIC -g\" \\\n    gem install msgpack\n",[2521],{"type":42,"tag":121,"props":2522,"children":2523},{"__ignoreMap":118},[2524,2551,2574,2597,2620,2643,2666,2689],{"type":42,"tag":125,"props":2525,"children":2526},{"class":127,"line":128},[2527,2531,2535,2539,2543,2547],{"type":42,"tag":125,"props":2528,"children":2529},{"style":138},[2530],{"type":47,"value":343},{"type":42,"tag":125,"props":2532,"children":2533},{"style":144},[2534],{"type":47,"value":147},{"type":42,"tag":125,"props":2536,"children":2537},{"style":144},[2538],{"type":47,"value":152},{"type":42,"tag":125,"props":2540,"children":2541},{"style":155},[2542],{"type":47,"value":356},{"type":42,"tag":125,"props":2544,"children":2545},{"style":144},[2546],{"type":47,"value":152},{"type":42,"tag":125,"props":2548,"children":2549},{"style":191},[2550],{"type":47,"value":223},{"type":42,"tag":125,"props":2552,"children":2553},{"class":127,"line":226},[2554,2558,2562,2566,2570],{"type":42,"tag":125,"props":2555,"children":2556},{"style":138},[2557],{"type":47,"value":372},{"type":42,"tag":125,"props":2559,"children":2560},{"style":144},[2561],{"type":47,"value":152},{"type":42,"tag":125,"props":2563,"children":2564},{"style":155},[2565],{"type":47,"value":381},{"type":42,"tag":125,"props":2567,"children":2568},{"style":144},[2569],{"type":47,"value":152},{"type":42,"tag":125,"props":2571,"children":2572},{"style":138},[2573],{"type":47,"value":223},{"type":42,"tag":125,"props":2575,"children":2576},{"class":127,"line":392},[2577,2581,2585,2589,2593],{"type":42,"tag":125,"props":2578,"children":2579},{"style":138},[2580],{"type":47,"value":398},{"type":42,"tag":125,"props":2582,"children":2583},{"style":144},[2584],{"type":47,"value":152},{"type":42,"tag":125,"props":2586,"children":2587},{"style":155},[2588],{"type":47,"value":407},{"type":42,"tag":125,"props":2590,"children":2591},{"style":144},[2592],{"type":47,"value":152},{"type":42,"tag":125,"props":2594,"children":2595},{"style":138},[2596],{"type":47,"value":223},{"type":42,"tag":125,"props":2598,"children":2599},{"class":127,"line":418},[2600,2604,2608,2612,2616],{"type":42,"tag":125,"props":2601,"children":2602},{"style":138},[2603],{"type":47,"value":424},{"type":42,"tag":125,"props":2605,"children":2606},{"style":144},[2607],{"type":47,"value":152},{"type":42,"tag":125,"props":2609,"children":2610},{"style":155},[2611],{"type":47,"value":433},{"type":42,"tag":125,"props":2613,"children":2614},{"style":144},[2615],{"type":47,"value":152},{"type":42,"tag":125,"props":2617,"children":2618},{"style":138},[2619],{"type":47,"value":223},{"type":42,"tag":125,"props":2621,"children":2622},{"class":127,"line":444},[2623,2627,2631,2635,2639],{"type":42,"tag":125,"props":2624,"children":2625},{"style":138},[2626],{"type":47,"value":450},{"type":42,"tag":125,"props":2628,"children":2629},{"style":144},[2630],{"type":47,"value":152},{"type":42,"tag":125,"props":2632,"children":2633},{"style":155},[2634],{"type":47,"value":459},{"type":42,"tag":125,"props":2636,"children":2637},{"style":144},[2638],{"type":47,"value":152},{"type":42,"tag":125,"props":2640,"children":2641},{"style":138},[2642],{"type":47,"value":223},{"type":42,"tag":125,"props":2644,"children":2645},{"class":127,"line":470},[2646,2650,2654,2658,2662],{"type":42,"tag":125,"props":2647,"children":2648},{"style":138},[2649],{"type":47,"value":1445},{"type":42,"tag":125,"props":2651,"children":2652},{"style":144},[2653],{"type":47,"value":152},{"type":42,"tag":125,"props":2655,"children":2656},{"style":155},[2657],{"type":47,"value":1454},{"type":42,"tag":125,"props":2659,"children":2660},{"style":144},[2661],{"type":47,"value":152},{"type":42,"tag":125,"props":2663,"children":2664},{"style":138},[2665],{"type":47,"value":223},{"type":42,"tag":125,"props":2667,"children":2668},{"class":127,"line":754},[2669,2673,2677,2681,2685],{"type":42,"tag":125,"props":2670,"children":2671},{"style":138},[2672],{"type":47,"value":1470},{"type":42,"tag":125,"props":2674,"children":2675},{"style":144},[2676],{"type":47,"value":152},{"type":42,"tag":125,"props":2678,"children":2679},{"style":155},[2680],{"type":47,"value":1454},{"type":42,"tag":125,"props":2682,"children":2683},{"style":144},[2684],{"type":47,"value":152},{"type":42,"tag":125,"props":2686,"children":2687},{"style":138},[2688],{"type":47,"value":223},{"type":42,"tag":125,"props":2690,"children":2691},{"class":127,"line":763},[2692,2696,2700],{"type":42,"tag":125,"props":2693,"children":2694},{"style":155},[2695],{"type":47,"value":476},{"type":42,"tag":125,"props":2697,"children":2698},{"style":155},[2699],{"type":47,"value":481},{"type":42,"tag":125,"props":2701,"children":2702},{"style":155},[2703],{"type":47,"value":2704}," msgpack\n",{"type":42,"tag":50,"props":2706,"children":2707},{},[2708],{"type":42,"tag":71,"props":2709,"children":2710},{},[2711,2713,2718],{"type":47,"value":2712},"Harness (",{"type":42,"tag":121,"props":2714,"children":2716},{"className":2715},[],[2717],{"type":47,"value":1007},{"type":47,"value":637},{"type":42,"tag":113,"props":2720,"children":2721},{"className":640,"code":1011,"language":22,"meta":118,"style":118},[2722],{"type":42,"tag":121,"props":2723,"children":2724},{"__ignoreMap":118},[2725,2732,2739,2746,2753,2760,2767,2774,2781,2788,2795,2802,2809,2816,2823],{"type":42,"tag":125,"props":2726,"children":2727},{"class":127,"line":128},[2728],{"type":42,"tag":125,"props":2729,"children":2730},{},[2731],{"type":47,"value":653},{"type":42,"tag":125,"props":2733,"children":2734},{"class":127,"line":226},[2735],{"type":42,"tag":125,"props":2736,"children":2737},{"emptyLinePlaceholder":659},[2738],{"type":47,"value":662},{"type":42,"tag":125,"props":2740,"children":2741},{"class":127,"line":392},[2742],{"type":42,"tag":125,"props":2743,"children":2744},{},[2745],{"type":47,"value":1037},{"type":42,"tag":125,"props":2747,"children":2748},{"class":127,"line":418},[2749],{"type":42,"tag":125,"props":2750,"children":2751},{},[2752],{"type":47,"value":670},{"type":42,"tag":125,"props":2754,"children":2755},{"class":127,"line":444},[2756],{"type":42,"tag":125,"props":2757,"children":2758},{"emptyLinePlaceholder":659},[2759],{"type":47,"value":662},{"type":42,"tag":125,"props":2761,"children":2762},{"class":127,"line":470},[2763],{"type":42,"tag":125,"props":2764,"children":2765},{},[2766],{"type":47,"value":876},{"type":42,"tag":125,"props":2768,"children":2769},{"class":127,"line":754},[2770],{"type":42,"tag":125,"props":2771,"children":2772},{},[2773],{"type":47,"value":1066},{"type":42,"tag":125,"props":2775,"children":2776},{"class":127,"line":763},[2777],{"type":42,"tag":125,"props":2778,"children":2779},{},[2780],{"type":47,"value":1074},{"type":42,"tag":125,"props":2782,"children":2783},{"class":127,"line":772},[2784],{"type":42,"tag":125,"props":2785,"children":2786},{},[2787],{"type":47,"value":1082},{"type":42,"tag":125,"props":2789,"children":2790},{"class":127,"line":781},[2791],{"type":42,"tag":125,"props":2792,"children":2793},{},[2794],{"type":47,"value":1090},{"type":42,"tag":125,"props":2796,"children":2797},{"class":127,"line":790},[2798],{"type":42,"tag":125,"props":2799,"children":2800},{},[2801],{"type":47,"value":850},{"type":42,"tag":125,"props":2803,"children":2804},{"class":127,"line":799},[2805],{"type":42,"tag":125,"props":2806,"children":2807},{},[2808],{"type":47,"value":894},{"type":42,"tag":125,"props":2810,"children":2811},{"class":127,"line":808},[2812],{"type":42,"tag":125,"props":2813,"children":2814},{},[2815],{"type":47,"value":859},{"type":42,"tag":125,"props":2817,"children":2818},{"class":127,"line":817},[2819],{"type":42,"tag":125,"props":2820,"children":2821},{"emptyLinePlaceholder":659},[2822],{"type":47,"value":662},{"type":42,"tag":125,"props":2824,"children":2825},{"class":127,"line":826},[2826],{"type":42,"tag":125,"props":2827,"children":2828},{},[2829],{"type":47,"value":919},{"type":42,"tag":50,"props":2831,"children":2832},{},[2833],{"type":42,"tag":71,"props":2834,"children":2835},{},[2836],{"type":47,"value":2837},"Run:",{"type":42,"tag":113,"props":2839,"children":2841},{"className":115,"code":2840,"language":117,"meta":118,"style":118},"export ASAN_OPTIONS=\"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0\"\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby fuzz_msgpack.rb\n",[2842],{"type":42,"tag":121,"props":2843,"children":2844},{"__ignoreMap":118},[2845,2872,2911],{"type":42,"tag":125,"props":2846,"children":2847},{"class":127,"line":128},[2848,2852,2856,2860,2864,2868],{"type":42,"tag":125,"props":2849,"children":2850},{"style":132},[2851],{"type":47,"value":135},{"type":42,"tag":125,"props":2853,"children":2854},{"style":138},[2855],{"type":47,"value":141},{"type":42,"tag":125,"props":2857,"children":2858},{"style":144},[2859],{"type":47,"value":147},{"type":42,"tag":125,"props":2861,"children":2862},{"style":144},[2863],{"type":47,"value":152},{"type":42,"tag":125,"props":2865,"children":2866},{"style":155},[2867],{"type":47,"value":158},{"type":42,"tag":125,"props":2869,"children":2870},{"style":144},[2871],{"type":47,"value":163},{"type":42,"tag":125,"props":2873,"children":2874},{"class":127,"line":226},[2875,2879,2883,2887,2891,2895,2899,2903,2907],{"type":42,"tag":125,"props":2876,"children":2877},{"style":138},[2878],{"type":47,"value":183},{"type":42,"tag":125,"props":2880,"children":2881},{"style":144},[2882],{"type":47,"value":188},{"type":42,"tag":125,"props":2884,"children":2885},{"style":191},[2886],{"type":47,"value":22},{"type":42,"tag":125,"props":2888,"children":2889},{"style":155},[2890],{"type":47,"value":198},{"type":42,"tag":125,"props":2892,"children":2893},{"style":144},[2894],{"type":47,"value":203},{"type":42,"tag":125,"props":2896,"children":2897},{"style":155},[2898],{"type":47,"value":208},{"type":42,"tag":125,"props":2900,"children":2901},{"style":144},[2902],{"type":47,"value":213},{"type":42,"tag":125,"props":2904,"children":2905},{"style":144},[2906],{"type":47,"value":218},{"type":42,"tag":125,"props":2908,"children":2909},{"style":191},[2910],{"type":47,"value":223},{"type":42,"tag":125,"props":2912,"children":2913},{"class":127,"line":392},[2914,2918],{"type":42,"tag":125,"props":2915,"children":2916},{"style":155},[2917],{"type":47,"value":232},{"type":42,"tag":125,"props":2919,"children":2920},{"style":155},[2921],{"type":47,"value":1187},{"type":42,"tag":263,"props":2923,"children":2925},{"id":2924},"example-pure-ruby-target",[2926],{"type":47,"value":2927},"Example: Pure Ruby Target",{"type":42,"tag":50,"props":2929,"children":2930},{},[2931],{"type":47,"value":2932},"Fuzzing pure Ruby code with a custom parser.",{"type":42,"tag":50,"props":2934,"children":2935},{},[2936],{"type":42,"tag":71,"props":2937,"children":2938},{},[2939,2941,2946],{"type":47,"value":2940},"Tracer (",{"type":42,"tag":121,"props":2942,"children":2944},{"className":2943},[],[2945],{"type":47,"value":635},{"type":47,"value":637},{"type":42,"tag":113,"props":2948,"children":2949},{"className":640,"code":641,"language":22,"meta":118,"style":118},[2950],{"type":42,"tag":121,"props":2951,"children":2952},{"__ignoreMap":118},[2953,2960,2967,2974,2981],{"type":42,"tag":125,"props":2954,"children":2955},{"class":127,"line":128},[2956],{"type":42,"tag":125,"props":2957,"children":2958},{},[2959],{"type":47,"value":653},{"type":42,"tag":125,"props":2961,"children":2962},{"class":127,"line":226},[2963],{"type":42,"tag":125,"props":2964,"children":2965},{"emptyLinePlaceholder":659},[2966],{"type":47,"value":662},{"type":42,"tag":125,"props":2968,"children":2969},{"class":127,"line":392},[2970],{"type":42,"tag":125,"props":2971,"children":2972},{},[2973],{"type":47,"value":670},{"type":42,"tag":125,"props":2975,"children":2976},{"class":127,"line":418},[2977],{"type":42,"tag":125,"props":2978,"children":2979},{"emptyLinePlaceholder":659},[2980],{"type":47,"value":662},{"type":42,"tag":125,"props":2982,"children":2983},{"class":127,"line":444},[2984],{"type":42,"tag":125,"props":2985,"children":2986},{},[2987],{"type":47,"value":685},{"type":42,"tag":50,"props":2989,"children":2990},{},[2991],{"type":42,"tag":71,"props":2992,"children":2993},{},[2994,2995,3000],{"type":47,"value":2712},{"type":42,"tag":121,"props":2996,"children":2998},{"className":2997},[],[2999],{"type":47,"value":699},{"type":47,"value":637},{"type":42,"tag":113,"props":3002,"children":3004},{"className":640,"code":3003,"language":22,"meta":118,"style":118},"# frozen_string_literal: true\n\nrequire 'ruzzy'\nrequire_relative 'my_parser'\n\ntest_one_input = lambda do |data|\n  begin\n    MyParser.parse(data)\n  rescue StandardError\n    # Expected exceptions from malformed input\n  end\n  return 0\nend\n\nRuzzy.fuzz(test_one_input)\n",[3005],{"type":42,"tag":121,"props":3006,"children":3007},{"__ignoreMap":118},[3008,3015,3022,3029,3037,3044,3051,3058,3066,3074,3082,3089,3096,3103,3110],{"type":42,"tag":125,"props":3009,"children":3010},{"class":127,"line":128},[3011],{"type":42,"tag":125,"props":3012,"children":3013},{},[3014],{"type":47,"value":653},{"type":42,"tag":125,"props":3016,"children":3017},{"class":127,"line":226},[3018],{"type":42,"tag":125,"props":3019,"children":3020},{"emptyLinePlaceholder":659},[3021],{"type":47,"value":662},{"type":42,"tag":125,"props":3023,"children":3024},{"class":127,"line":392},[3025],{"type":42,"tag":125,"props":3026,"children":3027},{},[3028],{"type":47,"value":670},{"type":42,"tag":125,"props":3030,"children":3031},{"class":127,"line":418},[3032],{"type":42,"tag":125,"props":3033,"children":3034},{},[3035],{"type":47,"value":3036},"require_relative 'my_parser'\n",{"type":42,"tag":125,"props":3038,"children":3039},{"class":127,"line":444},[3040],{"type":42,"tag":125,"props":3041,"children":3042},{"emptyLinePlaceholder":659},[3043],{"type":47,"value":662},{"type":42,"tag":125,"props":3045,"children":3046},{"class":127,"line":470},[3047],{"type":42,"tag":125,"props":3048,"children":3049},{},[3050],{"type":47,"value":876},{"type":42,"tag":125,"props":3052,"children":3053},{"class":127,"line":754},[3054],{"type":42,"tag":125,"props":3055,"children":3056},{},[3057],{"type":47,"value":1066},{"type":42,"tag":125,"props":3059,"children":3060},{"class":127,"line":763},[3061],{"type":42,"tag":125,"props":3062,"children":3063},{},[3064],{"type":47,"value":3065},"    MyParser.parse(data)\n",{"type":42,"tag":125,"props":3067,"children":3068},{"class":127,"line":772},[3069],{"type":42,"tag":125,"props":3070,"children":3071},{},[3072],{"type":47,"value":3073},"  rescue StandardError\n",{"type":42,"tag":125,"props":3075,"children":3076},{"class":127,"line":781},[3077],{"type":42,"tag":125,"props":3078,"children":3079},{},[3080],{"type":47,"value":3081},"    # Expected exceptions from malformed input\n",{"type":42,"tag":125,"props":3083,"children":3084},{"class":127,"line":790},[3085],{"type":42,"tag":125,"props":3086,"children":3087},{},[3088],{"type":47,"value":850},{"type":42,"tag":125,"props":3090,"children":3091},{"class":127,"line":799},[3092],{"type":42,"tag":125,"props":3093,"children":3094},{},[3095],{"type":47,"value":894},{"type":42,"tag":125,"props":3097,"children":3098},{"class":127,"line":808},[3099],{"type":42,"tag":125,"props":3100,"children":3101},{},[3102],{"type":47,"value":859},{"type":42,"tag":125,"props":3104,"children":3105},{"class":127,"line":817},[3106],{"type":42,"tag":125,"props":3107,"children":3108},{"emptyLinePlaceholder":659},[3109],{"type":47,"value":662},{"type":42,"tag":125,"props":3111,"children":3112},{"class":127,"line":826},[3113],{"type":42,"tag":125,"props":3114,"children":3115},{},[3116],{"type":47,"value":919},{"type":42,"tag":50,"props":3118,"children":3119},{},[3120],{"type":42,"tag":71,"props":3121,"children":3122},{},[3123],{"type":47,"value":2837},{"type":42,"tag":113,"props":3125,"children":3127},{"className":115,"code":3126,"language":117,"meta":118,"style":118},"export ASAN_OPTIONS=\"allocator_may_return_null=1:detect_leaks=0:use_sigaltstack=0\"\nLD_PRELOAD=$(ruby -e 'require \"ruzzy\"; print Ruzzy::ASAN_PATH') \\\n    ruby test_tracer.rb\n",[3128],{"type":42,"tag":121,"props":3129,"children":3130},{"__ignoreMap":118},[3131,3158,3197],{"type":42,"tag":125,"props":3132,"children":3133},{"class":127,"line":128},[3134,3138,3142,3146,3150,3154],{"type":42,"tag":125,"props":3135,"children":3136},{"style":132},[3137],{"type":47,"value":135},{"type":42,"tag":125,"props":3139,"children":3140},{"style":138},[3141],{"type":47,"value":141},{"type":42,"tag":125,"props":3143,"children":3144},{"style":144},[3145],{"type":47,"value":147},{"type":42,"tag":125,"props":3147,"children":3148},{"style":144},[3149],{"type":47,"value":152},{"type":42,"tag":125,"props":3151,"children":3152},{"style":155},[3153],{"type":47,"value":158},{"type":42,"tag":125,"props":3155,"children":3156},{"style":144},[3157],{"type":47,"value":163},{"type":42,"tag":125,"props":3159,"children":3160},{"class":127,"line":226},[3161,3165,3169,3173,3177,3181,3185,3189,3193],{"type":42,"tag":125,"props":3162,"children":3163},{"style":138},[3164],{"type":47,"value":183},{"type":42,"tag":125,"props":3166,"children":3167},{"style":144},[3168],{"type":47,"value":188},{"type":42,"tag":125,"props":3170,"children":3171},{"style":191},[3172],{"type":47,"value":22},{"type":42,"tag":125,"props":3174,"children":3175},{"style":155},[3176],{"type":47,"value":198},{"type":42,"tag":125,"props":3178,"children":3179},{"style":144},[3180],{"type":47,"value":203},{"type":42,"tag":125,"props":3182,"children":3183},{"style":155},[3184],{"type":47,"value":208},{"type":42,"tag":125,"props":3186,"children":3187},{"style":144},[3188],{"type":47,"value":213},{"type":42,"tag":125,"props":3190,"children":3191},{"style":144},[3192],{"type":47,"value":218},{"type":42,"tag":125,"props":3194,"children":3195},{"style":191},[3196],{"type":47,"value":223},{"type":42,"tag":125,"props":3198,"children":3199},{"class":127,"line":392},[3200,3204],{"type":42,"tag":125,"props":3201,"children":3202},{"style":155},[3203],{"type":47,"value":232},{"type":42,"tag":125,"props":3205,"children":3206},{"style":155},[3207],{"type":47,"value":982},{"type":42,"tag":56,"props":3209,"children":3211},{"id":3210},"troubleshooting",[3212],{"type":47,"value":3213},"Troubleshooting",{"type":42,"tag":1195,"props":3215,"children":3216},{},[3217,3237],{"type":42,"tag":1199,"props":3218,"children":3219},{},[3220],{"type":42,"tag":1203,"props":3221,"children":3222},{},[3223,3228,3233],{"type":42,"tag":1207,"props":3224,"children":3225},{},[3226],{"type":47,"value":3227},"Problem",{"type":42,"tag":1207,"props":3229,"children":3230},{},[3231],{"type":47,"value":3232},"Cause",{"type":42,"tag":1207,"props":3234,"children":3235},{},[3236],{"type":47,"value":2394},{"type":42,"tag":1218,"props":3238,"children":3239},{},[3240,3258,3280,3298,3316,3339],{"type":42,"tag":1203,"props":3241,"children":3242},{},[3243,3248,3253],{"type":42,"tag":1225,"props":3244,"children":3245},{},[3246],{"type":47,"value":3247},"Installation fails",{"type":42,"tag":1225,"props":3249,"children":3250},{},[3251],{"type":47,"value":3252},"Wrong clang version or path",{"type":42,"tag":1225,"props":3254,"children":3255},{},[3256],{"type":47,"value":3257},"Verify clang path, use clang 14.0.0+",{"type":42,"tag":1203,"props":3259,"children":3260},{},[3261,3270,3275],{"type":42,"tag":1225,"props":3262,"children":3263},{},[3264],{"type":42,"tag":121,"props":3265,"children":3267},{"className":3266},[],[3268],{"type":47,"value":3269},"cannot open shared object file",{"type":42,"tag":1225,"props":3271,"children":3272},{},[3273],{"type":47,"value":3274},"LD_PRELOAD not set",{"type":42,"tag":1225,"props":3276,"children":3277},{},[3278],{"type":47,"value":3279},"Set LD_PRELOAD inline with ruby command",{"type":42,"tag":1203,"props":3281,"children":3282},{},[3283,3288,3293],{"type":42,"tag":1225,"props":3284,"children":3285},{},[3286],{"type":47,"value":3287},"Fuzzer immediately exits",{"type":42,"tag":1225,"props":3289,"children":3290},{},[3291],{"type":47,"value":3292},"Missing corpus directory",{"type":42,"tag":1225,"props":3294,"children":3295},{},[3296],{"type":47,"value":3297},"Create corpus directory or pass as argument",{"type":42,"tag":1203,"props":3299,"children":3300},{},[3301,3306,3311],{"type":42,"tag":1225,"props":3302,"children":3303},{},[3304],{"type":47,"value":3305},"No coverage progress",{"type":42,"tag":1225,"props":3307,"children":3308},{},[3309],{"type":47,"value":3310},"Pure Ruby needs tracer",{"type":42,"tag":1225,"props":3312,"children":3313},{},[3314],{"type":47,"value":3315},"Use tracer script for pure Ruby code",{"type":42,"tag":1203,"props":3317,"children":3318},{},[3319,3324,3329],{"type":42,"tag":1225,"props":3320,"children":3321},{},[3322],{"type":47,"value":3323},"Leak detection spam",{"type":42,"tag":1225,"props":3325,"children":3326},{},[3327],{"type":47,"value":3328},"Ruby interpreter leaks",{"type":42,"tag":1225,"props":3330,"children":3331},{},[3332,3334],{"type":47,"value":3333},"Set ",{"type":42,"tag":121,"props":3335,"children":3337},{"className":3336},[],[3338],{"type":47,"value":2416},{"type":42,"tag":1203,"props":3340,"children":3341},{},[3342,3347,3352],{"type":42,"tag":1225,"props":3343,"children":3344},{},[3345],{"type":47,"value":3346},"Installation debug needed",{"type":42,"tag":1225,"props":3348,"children":3349},{},[3350],{"type":47,"value":3351},"Compilation errors",{"type":42,"tag":1225,"props":3353,"children":3354},{},[3355,3356],{"type":47,"value":2410},{"type":42,"tag":121,"props":3357,"children":3359},{"className":3358},[],[3360],{"type":47,"value":3361},"RUZZY_DEBUG=1 gem install --verbose ruzzy",{"type":42,"tag":56,"props":3363,"children":3365},{"id":3364},"related-skills",[3366],{"type":47,"value":3367},"Related Skills",{"type":42,"tag":263,"props":3369,"children":3371},{"id":3370},"technique-skills",[3372],{"type":47,"value":3373},"Technique Skills",{"type":42,"tag":1195,"props":3375,"children":3376},{},[3377,3393],{"type":42,"tag":1199,"props":3378,"children":3379},{},[3380],{"type":42,"tag":1203,"props":3381,"children":3382},{},[3383,3388],{"type":42,"tag":1207,"props":3384,"children":3385},{},[3386],{"type":47,"value":3387},"Skill",{"type":42,"tag":1207,"props":3389,"children":3390},{},[3391],{"type":47,"value":3392},"Use Case",{"type":42,"tag":1218,"props":3394,"children":3395},{},[3396,3411,3426,3441],{"type":42,"tag":1203,"props":3397,"children":3398},{},[3399,3406],{"type":42,"tag":1225,"props":3400,"children":3401},{},[3402],{"type":42,"tag":71,"props":3403,"children":3404},{},[3405],{"type":47,"value":1292},{"type":42,"tag":1225,"props":3407,"children":3408},{},[3409],{"type":47,"value":3410},"Detailed guidance on writing effective harnesses",{"type":42,"tag":1203,"props":3412,"children":3413},{},[3414,3421],{"type":42,"tag":1225,"props":3415,"children":3416},{},[3417],{"type":42,"tag":71,"props":3418,"children":3419},{},[3420],{"type":47,"value":2482},{"type":42,"tag":1225,"props":3422,"children":3423},{},[3424],{"type":47,"value":3425},"Memory error detection during fuzzing",{"type":42,"tag":1203,"props":3427,"children":3428},{},[3429,3436],{"type":42,"tag":1225,"props":3430,"children":3431},{},[3432],{"type":42,"tag":71,"props":3433,"children":3434},{},[3435],{"type":47,"value":2489},{"type":42,"tag":1225,"props":3437,"children":3438},{},[3439],{"type":47,"value":3440},"Detecting undefined behavior in C extensions",{"type":42,"tag":1203,"props":3442,"children":3443},{},[3444,3452],{"type":42,"tag":1225,"props":3445,"children":3446},{},[3447],{"type":42,"tag":71,"props":3448,"children":3449},{},[3450],{"type":47,"value":3451},"libfuzzer",{"type":42,"tag":1225,"props":3453,"children":3454},{},[3455],{"type":47,"value":3456},"Understanding libFuzzer options (Ruzzy is built on libFuzzer)",{"type":42,"tag":263,"props":3458,"children":3460},{"id":3459},"related-fuzzers",[3461],{"type":47,"value":3462},"Related Fuzzers",{"type":42,"tag":1195,"props":3464,"children":3465},{},[3466,3481],{"type":42,"tag":1199,"props":3467,"children":3468},{},[3469],{"type":42,"tag":1203,"props":3470,"children":3471},{},[3472,3476],{"type":42,"tag":1207,"props":3473,"children":3474},{},[3475],{"type":47,"value":3387},{"type":42,"tag":1207,"props":3477,"children":3478},{},[3479],{"type":47,"value":3480},"When to Consider",{"type":42,"tag":1218,"props":3482,"children":3483},{},[3484,3499],{"type":42,"tag":1203,"props":3485,"children":3486},{},[3487,3494],{"type":42,"tag":1225,"props":3488,"children":3489},{},[3490],{"type":42,"tag":71,"props":3491,"children":3492},{},[3493],{"type":47,"value":3451},{"type":42,"tag":1225,"props":3495,"children":3496},{},[3497],{"type":47,"value":3498},"When fuzzing Ruby C extension code directly in C\u002FC++",{"type":42,"tag":1203,"props":3500,"children":3501},{},[3502,3510],{"type":42,"tag":1225,"props":3503,"children":3504},{},[3505],{"type":42,"tag":71,"props":3506,"children":3507},{},[3508],{"type":47,"value":3509},"aflpp",{"type":42,"tag":1225,"props":3511,"children":3512},{},[3513],{"type":47,"value":3514},"Alternative approach for fuzzing Ruby by instrumenting Ruby interpreter",{"type":42,"tag":56,"props":3516,"children":3518},{"id":3517},"resources",[3519],{"type":47,"value":3520},"Resources",{"type":42,"tag":263,"props":3522,"children":3524},{"id":3523},"key-external-resources",[3525],{"type":47,"value":3526},"Key External Resources",{"type":42,"tag":50,"props":3528,"children":3529},{},[3530,3540],{"type":42,"tag":71,"props":3531,"children":3532},{},[3533],{"type":42,"tag":275,"props":3534,"children":3537},{"href":3535,"rel":3536},"https:\u002F\u002Fblog.trailofbits.com\u002F2024\u002F03\u002F29\u002Fintroducing-ruzzy-a-coverage-guided-ruby-fuzzer\u002F",[279],[3538],{"type":47,"value":3539},"Introducing Ruzzy, a coverage-guided Ruby fuzzer",{"type":47,"value":3541},"\nOfficial Trail of Bits blog post announcing Ruzzy, covering motivation, architecture, and initial results.",{"type":42,"tag":50,"props":3543,"children":3544},{},[3545,3555],{"type":42,"tag":71,"props":3546,"children":3547},{},[3548],{"type":42,"tag":275,"props":3549,"children":3552},{"href":3550,"rel":3551},"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy",[279],[3553],{"type":47,"value":3554},"Ruzzy GitHub Repository",{"type":47,"value":3556},"\nSource code, additional examples, and development instructions.",{"type":42,"tag":50,"props":3558,"children":3559},{},[3560,3570],{"type":42,"tag":71,"props":3561,"children":3562},{},[3563],{"type":42,"tag":275,"props":3564,"children":3567},{"href":3565,"rel":3566},"https:\u002F\u002Fllvm.org\u002Fdocs\u002FLibFuzzer.html",[279],[3568],{"type":47,"value":3569},"libFuzzer Documentation",{"type":47,"value":3571},"\nSince Ruzzy is built on libFuzzer, understanding libFuzzer options and behavior is valuable.",{"type":42,"tag":50,"props":3573,"children":3574},{},[3575,3585],{"type":42,"tag":71,"props":3576,"children":3577},{},[3578],{"type":42,"tag":275,"props":3579,"children":3582},{"href":3580,"rel":3581},"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy#fuzzing-ruby-c-extensions",[279],[3583],{"type":47,"value":3584},"Fuzzing Ruby C extensions",{"type":47,"value":3586},"\nDetailed guide on fuzzing C extensions with compilation flags and examples.",{"type":42,"tag":50,"props":3588,"children":3589},{},[3590,3600],{"type":42,"tag":71,"props":3591,"children":3592},{},[3593],{"type":42,"tag":275,"props":3594,"children":3597},{"href":3595,"rel":3596},"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fruzzy#fuzzing-pure-ruby-code",[279],[3598],{"type":47,"value":3599},"Fuzzing pure Ruby code",{"type":47,"value":3601},"\nDetailed guide on the tracer pattern required for pure Ruby fuzzing.",{"type":42,"tag":3603,"props":3604,"children":3605},"style",{},[3606],{"type":47,"value":3607},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3609,"total":3703},[3610,3624,3633,3653,3668,3681,3693],{"slug":2482,"name":2482,"fn":3611,"description":3612,"org":3613,"tags":3614,"stars":23,"repoUrl":24,"updatedAt":3623},"detect memory errors during fuzzing","AddressSanitizer detects memory errors during fuzzing. Use when fuzzing C\u002FC++ code to find buffer overflows and use-after-free bugs.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3615,3618,3621,3622],{"name":3616,"slug":3617,"type":16},"C#","c",{"name":3619,"slug":3620,"type":16},"Debugging","debugging",{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},"2026-07-17T06:05:14.925095",{"slug":3509,"name":3509,"fn":3625,"description":3626,"org":3627,"tags":3628,"stars":23,"repoUrl":24,"updatedAt":3632},"perform multi-core fuzzing of C\u002FC++ projects","AFL++ is a fork of AFL with better fuzzing performance and advanced features. Use for multi-core fuzzing of C\u002FC++ projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3629,3630,3631],{"name":3616,"slug":3617,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},"2026-07-17T06:05:12.433192",{"slug":3634,"name":3634,"fn":3635,"description":3636,"org":3637,"tags":3638,"stars":23,"repoUrl":24,"updatedAt":3652},"agentic-actions-auditor","audit GitHub Actions for security vulnerabilities","Audits GitHub Actions workflows for security vulnerabilities in AI agent integrations including Claude Code Action, Gemini CLI, OpenAI Codex, and GitHub AI Inference. Detects attack vectors where attacker-controlled input reaches AI agents running in CI\u002FCD pipelines, including env var intermediary patterns, direct expression injection, dangerous sandbox configurations, and wildcard user allowlists. Use when reviewing workflow files that invoke AI coding agents, auditing CI\u002FCD pipeline security for prompt injection risks, or evaluating agentic action configurations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3639,3642,3645,3648,3651],{"name":3640,"slug":3641,"type":16},"Agents","agents",{"name":3643,"slug":3644,"type":16},"CI\u002FCD","ci-cd",{"name":3646,"slug":3647,"type":16},"Code Analysis","code-analysis",{"name":3649,"slug":3650,"type":16},"GitHub Actions","github-actions",{"name":14,"slug":15,"type":16},"2026-07-18T05:47:48.564744",{"slug":3654,"name":3654,"fn":3655,"description":3656,"org":3657,"tags":3658,"stars":23,"repoUrl":24,"updatedAt":3667},"algorand-vulnerability-scanner","scan Algorand smart contracts for vulnerabilities","Scans Algorand smart contracts for 11 common vulnerabilities including rekeying attacks, unchecked transaction fees, missing field validations, and access control issues. Use when auditing Algorand projects (TEAL\u002FPyTeal).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3659,3662,3663,3664],{"name":3660,"slug":3661,"type":16},"Audit","audit",{"name":3646,"slug":3647,"type":16},{"name":14,"slug":15,"type":16},{"name":3665,"slug":3666,"type":16},"Smart Contracts","smart-contracts","2026-07-18T05:47:43.989063",{"slug":3669,"name":3669,"fn":3670,"description":3671,"org":3672,"tags":3673,"stars":23,"repoUrl":24,"updatedAt":3680},"ask-questions-if-underspecified","clarify requirements before implementation","Clarify requirements before implementing. Use when serious doubts arise.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3674,3677],{"name":3675,"slug":3676,"type":16},"Engineering","engineering",{"name":3678,"slug":3679,"type":16},"Productivity","productivity","2026-07-17T06:05:33.543262",{"slug":3682,"name":3682,"fn":3683,"description":3684,"org":3685,"tags":3686,"stars":23,"repoUrl":24,"updatedAt":3692},"atheris","fuzz Python code with Atheris","Atheris is a coverage-guided Python fuzzer based on libFuzzer. Use for fuzzing pure Python code and Python C extensions.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3687,3690,3691],{"name":3688,"slug":3689,"type":16},"Python","python",{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},"2026-07-17T06:05:14.575191",{"slug":3694,"name":3694,"fn":3695,"description":3696,"org":3697,"tags":3698,"stars":23,"repoUrl":24,"updatedAt":3702},"audit-augmentation","augment code graphs with audit findings","Augments Trailmark code graphs with external audit findings from SARIF static analysis results, weAudit annotation files, and version-gated Trailmark 0.4.x binary-analysis graph exports. Maps findings to graph nodes by file and line overlap, creates severity-based subgraphs, and enables cross-referencing findings with pre-analysis data (blast radius, taint, etc.). Use when projecting SARIF results onto a code graph, overlaying weAudit annotations, importing binary graph findings, cross-referencing Semgrep, CodeQL, or binary-analysis findings with call graph data, or visualizing audit findings in the context of code structure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3699,3700,3701],{"name":3660,"slug":3661,"type":16},{"name":3646,"slug":3647,"type":16},{"name":14,"slug":15,"type":16},"2026-08-01T05:44:54.920542",77,{"items":3705,"total":3809},[3706,3713,3719,3727,3734,3739,3745,3751,3764,3775,3787,3798],{"slug":2482,"name":2482,"fn":3611,"description":3612,"org":3707,"tags":3708,"stars":23,"repoUrl":24,"updatedAt":3623},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3709,3710,3711,3712],{"name":3616,"slug":3617,"type":16},{"name":3619,"slug":3620,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"slug":3509,"name":3509,"fn":3625,"description":3626,"org":3714,"tags":3715,"stars":23,"repoUrl":24,"updatedAt":3632},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3716,3717,3718],{"name":3616,"slug":3617,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"slug":3634,"name":3634,"fn":3635,"description":3636,"org":3720,"tags":3721,"stars":23,"repoUrl":24,"updatedAt":3652},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3722,3723,3724,3725,3726],{"name":3640,"slug":3641,"type":16},{"name":3643,"slug":3644,"type":16},{"name":3646,"slug":3647,"type":16},{"name":3649,"slug":3650,"type":16},{"name":14,"slug":15,"type":16},{"slug":3654,"name":3654,"fn":3655,"description":3656,"org":3728,"tags":3729,"stars":23,"repoUrl":24,"updatedAt":3667},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3730,3731,3732,3733],{"name":3660,"slug":3661,"type":16},{"name":3646,"slug":3647,"type":16},{"name":14,"slug":15,"type":16},{"name":3665,"slug":3666,"type":16},{"slug":3669,"name":3669,"fn":3670,"description":3671,"org":3735,"tags":3736,"stars":23,"repoUrl":24,"updatedAt":3680},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3737,3738],{"name":3675,"slug":3676,"type":16},{"name":3678,"slug":3679,"type":16},{"slug":3682,"name":3682,"fn":3683,"description":3684,"org":3740,"tags":3741,"stars":23,"repoUrl":24,"updatedAt":3692},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3742,3743,3744],{"name":3688,"slug":3689,"type":16},{"name":14,"slug":15,"type":16},{"name":18,"slug":19,"type":16},{"slug":3694,"name":3694,"fn":3695,"description":3696,"org":3746,"tags":3747,"stars":23,"repoUrl":24,"updatedAt":3702},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3748,3749,3750],{"name":3660,"slug":3661,"type":16},{"name":3646,"slug":3647,"type":16},{"name":14,"slug":15,"type":16},{"slug":3752,"name":3752,"fn":3753,"description":3754,"org":3755,"tags":3756,"stars":23,"repoUrl":24,"updatedAt":3763},"audit-context-building","build architectural context for code analysis","Enables ultra-granular, line-by-line code analysis to build deep architectural context before vulnerability or bug finding.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3757,3760,3761,3762],{"name":3758,"slug":3759,"type":16},"Architecture","architecture",{"name":3660,"slug":3661,"type":16},{"name":3646,"slug":3647,"type":16},{"name":3675,"slug":3676,"type":16},"2026-07-18T05:47:40.122449",{"slug":3765,"name":3765,"fn":3766,"description":3767,"org":3768,"tags":3769,"stars":23,"repoUrl":24,"updatedAt":3774},"audit-prep-assistant","prepare codebases for security audits","Prepares codebases for security review using Trail of Bits' checklist. Helps set review goals, runs static analysis tools, increases test coverage, removes dead code, ensures accessibility, and generates documentation (flowcharts, user stories, inline comments).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3770,3771,3772,3773],{"name":3660,"slug":3661,"type":16},{"name":3646,"slug":3647,"type":16},{"name":3675,"slug":3676,"type":16},{"name":14,"slug":15,"type":16},"2026-07-18T05:47:39.210985",{"slug":3776,"name":3776,"fn":3777,"description":3778,"org":3779,"tags":3780,"stars":23,"repoUrl":24,"updatedAt":3786},"burpsuite-project-parser","parse Burp Suite project files","Searches and explores Burp Suite project files (.burp) from the command line. Use when searching response headers or bodies with regex patterns, extracting security audit findings, dumping proxy history or site map data, or analyzing HTTP traffic captured in a Burp project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3781,3782,3785],{"name":3660,"slug":3661,"type":16},{"name":3783,"slug":3784,"type":16},"CLI","cli",{"name":14,"slug":15,"type":16},"2026-07-17T06:05:33.198077",{"slug":3788,"name":3788,"fn":3789,"description":3790,"org":3791,"tags":3792,"stars":23,"repoUrl":24,"updatedAt":3797},"c-review","audit C and C++ code","Performs comprehensive C\u002FC++ security review for memory corruption, integer overflows, race conditions, and platform-specific vulnerabilities. Use when auditing native C\u002FC++ applications, reviewing daemons or services for memory safety, or hunting integer overflow \u002F use-after-free \u002F race conditions in userspace code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3793,3794,3795,3796],{"name":3660,"slug":3661,"type":16},{"name":3616,"slug":3617,"type":16},{"name":3646,"slug":3647,"type":16},{"name":14,"slug":15,"type":16},"2026-07-17T06:05:11.333374",{"slug":3799,"name":3799,"fn":3800,"description":3801,"org":3802,"tags":3803,"stars":23,"repoUrl":24,"updatedAt":3808},"cairo-vulnerability-scanner","scan Cairo and StarkNet contracts for vulnerabilities","Scans Cairo\u002FStarkNet smart contracts for 6 critical vulnerabilities including felt252 arithmetic overflow, L1-L2 messaging issues, address conversion problems, and signature replay. Use when auditing StarkNet projects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3804,3805,3806,3807],{"name":3660,"slug":3661,"type":16},{"name":3646,"slug":3647,"type":16},{"name":14,"slug":15,"type":16},{"name":3665,"slug":3666,"type":16},"2026-07-18T05:47:42.84568",111]