[
  {
    "path": ".gitattributes",
    "content": "*.md linguist-detectable=true\n*.md linguist-documentation=false\n*.yml linguist-detectable=true\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: analysis-tools-dev \nopen_collective: analysis-tools\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: cargo\n  directory: \"/data/render\"\n  schedule:\n    interval: daily\n    time: \"11:00\"\n  open-pull-requests-limit: 10\n  ignore:\n  - dependency-name: tokio\n    versions:\n    - 1.1.1\n    - 1.2.0\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!--\n\n👋 Thank you for your contribution!\nPlease make sure to check all of the items below.\n\n- 🚨 New tools have to be added to `data/tools/` (NOT directly to the `README.md`).\n- If you propose to deprecate a tool, you have to provide a reason below.\n- More details in the contributors guide, `CONTRIBUTING.md`\n\n-->\n\n* [ ] I have not changed the `README.md` directly.\n\n\n"
  },
  {
    "path": ".github/workflows/auto-merge.yml",
    "content": "name: auto-merge\n\non:\n  pull_request:\n\njobs:\n  auto-merge:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - uses: ahmadnassri/action-dependabot-auto-merge@v2\n        with:\n          github-token: ${{ secrets.AUTOMERGE_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  pull_request:\n    branches: [master]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - name: Render list\n        run: make render-skip-deprecated\n"
  },
  {
    "path": ".github/workflows/links.yml",
    "content": "name: Links\n\non:\n  repository_dispatch:\n  workflow_dispatch:\n  schedule:\n    - cron: \"00 18 * * *\"\n\njobs:\n  linkChecker:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n        \n      - name: Link Checker\n        uses: lycheeverse/lychee-action@master\n        with:\n          # Only check README, which also ignores files in data/render/templates\n          # See https://github.com/analysis-tools-dev/dynamic-analysis/issues/117\n          # Ideally we should exclude this path, but that is not supported by lychee yet.\n          # See https://github.com/lycheeverse/lychee/issues/418\n          args: --verbose --no-progress README.md\n      \n      - name: Create Issue From File\n        if: env.lychee_exit_code != 0\n        uses: peter-evans/create-issue-from-file@v4\n        with:\n          title: Link Checker Report\n          content-filepath: ./lychee/out.md\n          labels: report, automated issue\n"
  },
  {
    "path": ".github/workflows/render.yml",
    "content": "name: Render\n\non:\n  push:\n    branches: [master]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n        \n      - name: Render list\n        run: make render\n        \n      - uses: stefanzweifel/git-auto-commit-action@v4.1.2\n        with:\n          branch: ${{ github.head_ref }}\n          commit_message: Commit list\n          commit_user_name: Analysis Tools Bot\n          commit_user_email: bot@analysis-tools.dev\n          commit_author: Analysis Tools Bot <bot@analysis-tools.dev>\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: \"Close stale issues\"\non:\n  schedule:\n    - cron: \"0 4 * * *\"\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@v4.1.0\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n          stale-issue-message: >\n            This issue has been automatically marked as stale because it has not had\n            recent activity in the last 60 days. It will be closed in 7 days if no further activity occurs.\n            Thank you for your contributions.\n          days-before-stale: 60\n          days-before-close: 7\n          stale-issue-label: stale\n"
  },
  {
    "path": ".lycheeignore",
    "content": "https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool\nhttps://www.intel.com/content/www/us/en/developer/articles/tool/pin-a-dynamic-binary-instrumentation-tool.html\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# How to add a new tool to the list\n\nPlease feel free to open a pull request if you know of a dynamic analysis tool that\nis not mentioned here.  \nIf you're in doubt if a tool is a good fit for the list, **don't open an issue,\nbut create a pull request right away** because that's easier to handle. Thanks!\n:smiley:\n\n### Requirements\n\nEach tool on the list should be\n\n- actively maintained (more than one contributor)\n- actively used (have **more than 20 stars on Github or similar impact**)\n- relatively mature (project exists for at least three months)\n\n### Format\n\nThe main `README.md` is just a rendered version of the data. To add a new tool,\nplease create a file in the `data/tools` directory.\n\n- Make each tool description as precise as possible.  \n  Please limit the description to **500 characters**.\n- By default, we assume that the tool is open source.\n  If a tool is proprietary, add `proprietary: true`.\n- Please add as many tags as possible. You can choose from the tags\n  in `data/tags.yml` If a tool does not match any existing tag, feel\n  free to add a new tag.\n\nFinally, create a pull request with all your changes.\nYou can call `make render` to check for errors before.  \nThis is optional, because it will also be done when creating\na pull request.\n\n# How to mark a tool as unmaintained/deprecated\n\nSometimes a tool becomes unmaintained and there's nothing wrong with that.  \nAfter all, a tool can still be very valuable to the community - even without\nfrequent updates.  \nHowever, since it is one of the goals of this project to allow people to make an\ninformed decision on what is the best tool for the job, we are marking\nunmaintained or deprecated tools.\n[Here](https://github.com/mre/awesome-static-analysis/issues/223) is a nice\ndiscussion about why we think this is necessary. If you find a tool, which is\nunmaintained, please add `deprecated: true` to the entry in `data/tools/` and\ncreate a pull request in which you provide an objective explanation as to why\nyou think the tool should be marked deprecated. Every deprecation will be\nhandled on a case-by-case basis.\n\n**Thanks for helping out!** :tada:\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 The analysis tools developers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "# Dynamic Analysis Tools Repository Makefile\n\n.PHONY: render render-skip-deprecated check clippy fmt test clean help\n\n# Default target shows help\nhelp:\n\t@echo \"Available targets:\"\n\t@echo \"  render              - Render README.md and JSON API from YAML sources\"\n\t@echo \"  render-skip-deprecated - Render without deprecated tools\"\n\t@echo \"  check               - Run cargo check\"\n\t@echo \"  clippy              - Run clippy lints\"\n\t@echo \"  fmt                 - Format Rust code\"\n\t@echo \"  test                - Run tests\"\n\t@echo \"  clean               - Clean build artifacts\"\n\t@echo \"  help                - Show this help\"\n\n# Main rendering targets\nrender:\n\tcargo run --manifest-path data/render/Cargo.toml -- --tags data/tags.yml --tools data/tools --md-out README.md --json-out data/api\n\nrender-skip-deprecated:\n\tcargo run --manifest-path data/render/Cargo.toml -- --tags data/tags.yml --tools data/tools --md-out README.md --json-out data/api --skip-deprecated\n\n# Development targets\ncheck:\n\tcargo check --manifest-path data/render/Cargo.toml\n\nclippy:\n\tcargo clippy --manifest-path data/render/Cargo.toml -- -D warnings\n\nfmt:\n\tcargo fmt --manifest-path data/render/Cargo.toml\n\ntest:\n\tcargo test --manifest-path data/render/Cargo.toml\n\nclean:\n\tcargo clean --manifest-path data/render/Cargo.toml"
  },
  {
    "path": "README.md",
    "content": "<!-- 🚨🚨 DON'T EDIT THIS FILE DIRECTLY. Edit `data/tools.yml` instead. 🚨🚨 -->\n\n<a href=\"https://analysis-tools.dev/\">\n  <img alt=\"Analysis Tools Website\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/redesign.svg\" />\n</a>\n\nThis repository lists **dynamic analysis tools** for all programming languages, build tools, config files and more. The focus is on tools which improve code quality such as linters and formatters.\nThe official website, [analysis-tools.dev](https://analysis-tools.dev/) is based on this repository and adds rankings, user comments, and additional resources like videos for each tool.\n\n[![Website](https://img.shields.io/badge/Website-Online-2B5BAE)](https://analysis-tools.dev)\n![CI](https://github.com/analysis-tools-dev/dynamic-analysis/workflows/CI/badge.svg)\n\n## Sponsors\n\nThis project would not be possible without the generous support of our sponsors.\n\n<table>\n   <tr>\n      <td>\n         <a href=\"https://bugprove.com\">\n            <picture >\n               <source width=\"200px\" media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/bugprove-dark.svg\">\n               <img width=\"200px\" alt=\"BugProve\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/bugprove-light.svg\">\n            </picture>\n         </a>\n      </td>\n      <td>\n         <a href=\"https://www.betterscan.io\">\n            <picture >\n               <source width=\"200px\" media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/betterscan-dark.svg\">\n               <img width=\"200px\" alt=\"Betterscan\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/betterscan-light.svg\">\n            </picture>\n         </a>\n      </td>\n      <td>\n         <a href=\"https://www.pixee.ai/\">\n            <picture >\n               <source width=\"200px\" media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/pixee-light.png\">\n               <img width=\"200px\" alt=\"Pixee\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/pixee-dark.png\">\n            </picture>\n         </a>\n      </td>\n      <td>\n         <a href=\"https://coderabbit.ai\">\n            <img width=\"200px\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/code-rabbit.svg\" />\n         </a>\n      </td>\n      <td>\n         <a href=\"https://semgrep.dev/\">\n            <img width=\"200px\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/semgrep.svg\" />\n         </a>\n      </td>\n      <td>\n         <a href=\"https://offensive360.com/\">\n            <img width=\"200px\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/offensive360.png\" />\n         </a>\n      </td>\n   </tr>\n</table>\n\nIf you also want to support this project, head over to our [Github sponsors page](https://github.com/sponsors/analysis-tools-dev).\n\n## Meaning of Symbols:\n\n- :copyright: stands for proprietary software. All other tools are Open Source.\n- :information_source: indicates that the community does not recommend to use this tool for new projects anymore. The icon links to the discussion issue.\n- :warning: means that this tool was not updated for more than 1 year, or the repo was archived.\n\nPull requests are very welcome!  \nAlso check out the sister project, [awesome-static-analysis](https://github.com/mre/awesome-static-analysis).\n\n## Table of Contents\n\n#### [Programming Languages](#programming-languages-1)\n\n<details>\n <summary>Show languages</summary>\n  <!-- Please use HTML syntax here so that it works for Github and mkdocs -->\n  <ul>\n    <li><a href=\"#dotnet\">.NET</a></li>\n    <li><a href=\"#c\">C</a></li>\n    <li><a href=\"#cpp\">C++</a></li>\n    <li><a href=\"#go\">Go</a></li>\n    <li><a href=\"#java\">Java</a></li>\n    <li><a href=\"#javascript\">JavaScript</a></li>\n    <li><a href=\"#php\">PHP</a></li>\n    <li><a href=\"#python\">Python</a></li>\n    <li><a href=\"#ruby\">Ruby</a></li>\n    <li><a href=\"#rust\">Rust</a></li>\n    <li><a href=\"#sql\">SQL</a></li>\n    <li><a href=\"#vbasic\">Visual Basic</a></li>\n    <li><a href=\"#zig\">Zig</a></li>\n    </ul>\n</details>\n\n#### [Multiple languages](#multiple-languages-1)\n\n#### [Other](#other-1)\n\n\n\n- [API](#api)\n  \n\n- [Binaries](#binary)\n  \n\n- [Bytecode/IR](#bytecode)\n  \n\n- [Cloud](#cloud)\n  \n\n- [Containers](#container)\n  \n\n- [Laravel](#laravel)\n  \n\n- [Security/DAST](#security)\n  \n\n- [Web](#web)\n  \n\n- [WebAssembly](#webassembly)\n  \n\n- [XML](#xml)\n  \n\n---\n\n## Programming Languages\n\n<h2 id=\"dotnet\">.NET</h2>\n\n\n\n- [Microsoft IntelliTest](https://docs.microsoft.com/en-us/visualstudio/test/intellitest-manual/getting-started?view=vs-2019) — Generate a candidate suite of tests for your .NET code.\n  \n\n- [Pex and Moles](https://www.microsoft.com/en-us/research/project/pex-and-moles-isolation-and-white-box-unit-testing-for-net/) — Pex automatically generates test suites with high code coverage using automated white box analysis.\n  \n\n<h2 id=\"c\">C</h2>\n\n\n\n- [CHAP](https://github.com/vmware/chap) — Analyzes un-instrumented ELF core files for leaks, memory growth, and corruption. It helps explain memory growth, can identify some forms of corruption, and  supplements a debugger by giving the status of various memory locations.\n  \n\n- [KLEE](https://github.com/klee/klee) — Symbolic virtual machine built on top of the LLVM compiler infrastructure.\n  \n\n- [LDRA](https://ldra.com) :copyright: — A tool suite including dynamic analysis and test to various standards can ensure test coverage to 100% op-code, branch & decsion coverage.\n  \n\n- [LLVM/Clang Sanitizers](https://github.com/google/sanitizers) — <ul> <li><a href=\"https://github.com/google/sanitizers/wiki/AddressSanitizer\">AddressSanitizer</a> - A memory error detector for C/C++</li> <li><a href=\"https://github.com/google/sanitizers/wiki/MemorySanitizer\">MemorySanitizer</a> - A detector of uninitialized memory reads in C/C++ programs.</li> <li><a href=\"https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual\">ThreadSanitizer</a> - A data race detector for C/C++</li> </ul>\n  \n\n- [Valgrind](https://valgrind.org/) — An instrumentation framework for building dynamic analysis tools.\n  \n\n<h2 id=\"cpp\">C++</h2>\n\n\n\n- [CHAP](https://github.com/vmware/chap) — Analyzes un-instrumented ELF core files for leaks, memory growth, and corruption. It helps explain memory growth, can identify some forms of corruption, and  supplements a debugger by giving the status of various memory locations.\n  \n\n- [KLEE](https://github.com/klee/klee) — Symbolic virtual machine built on top of the LLVM compiler infrastructure.\n  \n\n- [LDRA](https://ldra.com) :copyright: — A tool suite including dynamic analysis and test to various standards can ensure test coverage to 100% op-code, branch & decsion coverage.\n  \n\n- [LLVM/Clang Sanitizers](https://github.com/google/sanitizers) — <ul> <li><a href=\"https://github.com/google/sanitizers/wiki/AddressSanitizer\">AddressSanitizer</a> - A memory error detector for C/C++</li> <li><a href=\"https://github.com/google/sanitizers/wiki/MemorySanitizer\">MemorySanitizer</a> - A detector of uninitialized memory reads in C/C++ programs.</li> <li><a href=\"https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual\">ThreadSanitizer</a> - A data race detector for C/C++</li> </ul>\n  \n\n- [Valgrind](https://valgrind.org/) — An instrumentation framework for building dynamic analysis tools.\n  \n\n<h2 id=\"go\">Go</h2>\n\n\n\n- [statsviz](https://github.com/arl/statsviz) — Instant live visualization of your Go application runtime statistics in the browser. It plots heap usage, MSpans/MCaches, Object counts, Goroutines and GC/CPU fraction.\n  \n\n<h2 id=\"java\">Java</h2>\n\n\n\n- [Java PathFinder](https://github.com/javapathfinder/jpf-core) — An extensible software model checking framework for Java bytecode programs.\n  \n\n- [Parasoft Jtest](https://www.parasoft.com/products/jtest) :copyright: — Jtest is an automated Java software testing and static analysis product that is made by Parasoft. The product includes technology for Data-flow analysis Unit test-case generation and execution, static analysis, regression testing, code coverage, and runtime error detection.\n  \n\n<h2 id=\"javascript\">JavaScript</h2>\n\n\n\n- [Iroh.js](https://github.com/maierfelix/Iroh) — A dynamic code analysis tool for JavaScript. Iroh allows to record your code flow in realtime, intercept runtime informations and manipulate program behaviour on the fly.\n  \n\n- [Jalangi2](https://github.com/Samsung/jalangi2) — Jalangi2 is a popular framework for writing dynamic analyses for JavaScript.\n  \n\n<h2 id=\"php\">PHP</h2>\n\n\n\n- [Enlightn](https://www.laravel-enlightn.com/) — A static and dynamic analysis tool for Laravel applications that provides recommendations to improve the performance, security and code reliability of Laravel apps. Contains 120 automated checks.\n  \n\n<h2 id=\"python\">Python</h2>\n\n\n\n- [CrossHair](https://github.com/pschanely/CrossHair) — Symbolic execution engine for testing Python contracts.\n  \n\n- [DynaPyt](https://github.com/sola-st/DynaPyt) — DynaPyt is a framework for writing dynamic analyses for Python. The analyses can also modify runtime values to alter the execution.\n  \n\n- [icontract](https://github.com/Parquery/icontract) — Design-by-contract library supporting behavioral subtyping\nThere is also a wider tooling around the icontract library such as  a linter (pyicontract-lint) and a plug-in for Sphinx (sphinx-icontract).\n  \n\n- [Scalene](https://github.com/emeryberger/scalene) — A high-performance, high-precision CPU and memory profiler for Python\n  \n\n- [typo](https://github.com/aldanor/typo) — Runtime Type Checking for Python 3.\n  \n\n<h2 id=\"ruby\">Ruby</h2>\n\n\n\n- [suture](https://github.com/testdouble/suture) — A Ruby gem that helps you refactor your legacy code  by the result of some old behavior with a new version.\n  \n\n<h2 id=\"rust\">Rust</h2>\n\n\n\n- [cargo-careful](https://github.com/RalfJung/cargo-careful) — Execute Rust code carefully, with extra checking along the way. It builds the standard library with debug assertions.\nHere are some of the checks this enables:\n* `get_unchecked` in slices performs bounds checks * `copy`, `copy_nonoverlapping`, and `write_bytes` check that pointers are aligned and non-null and (if applicable) non-overlapping `{NonNull,NonZero*,...}::new_unchecked` check that the value is valid * plenty of internal consistency checks in the collection types * mem::zeroed and the deprecated mem::uninitialized panic if the type does not allow that kind of initialization\n  \n\n- [hyperfine](https://github.com/sharkdp/hyperfine) — A command-line benchmarking tool It features statistical analysis across multiple runs, support for arbitrary shell commands, constant feedback about the benchmark progress and current estimates, warmup runs, a simple and expressive syntax, and more.\n  \n\n- [loom](https://github.com/tokio-rs/loom) — Concurrency permutation testing tool for Rust.  It runs a test many times, permuting the possible concurrent executions of that test.\n  \n\n- [MIRI](https://github.com/rust-lang/miri) — An interpreter for Rust's mid-level intermediate representation, which can detect certain classes of undefined behavior like out-of-bounds memory accesses and use-after-free.\n  \n\n- [puffin](https://github.com/EmbarkStudios/puffin) — Instrumentation profiler for Rust.\n  \n\n- [rust-san](https://github.com/japaric/rust-san) — How-to sanitize your Rust code with built-in Rust dynamic analyzers\n  \n\n- [stuck](https://github.com/jonhoo/stuck) — provides a visualization for quickly identifying common bottlenecks in running, asynchronous, and concurrent applications.\n  \n\n<h2 id=\"sql\">SQL</h2>\n\n\n\n- [WhiteHat Sentinel Dynamic](https://www.synopsys.com/software-integrity/security-testing/dast.html) :copyright: — Part of the WhiteHat Application Security Platform. Dynamic application security scanner that covers the OWASP Top 10.\n  \n\n<h2 id=\"vbasic\">Visual Basic</h2>\n\n\n\n- [VB Watch](https://www.aivosto.com/vbwatch.html) :copyright: — Profiler, Protector and Debugger for VB6. Profiler measures performance and test coverage. Protector implements robust error handling. Debugger helps monitor your executables.\n  \n\n<h2 id=\"zig\">Zig</h2>\n\n\n\n- [poop](https://github.com/andrewrk/poop) — Performance Optimizer Observation Platform This command line tool uses Linux's `perf_event_open` functionality to compare the performance of multiple commands with a colorful terminal user interface. It is similar to `hyperfine`.\n  \n\n## Multiple languages\n\n\n\n- [allocscope](https://github.com/matt-kimball/allocscope) — allocscope is a tool for tracking down where the most egregiously large allocations are occurring in a C, C++ or Rust codebase. It is particularly intendend to be useful for developers who want to get a handle on excessive allocations and are working in a large codebase with multiple contributors with allocations occuring in many modules or libraries.\n  \n\n- [bytehound](https://github.com/koute/bytehound) — A memory profiler for Linux. Can be used to analyze memory leaks, see where exactly the memory is being consumed, identify temporary allocations and investigate excessive memory fragmentation.\n  \n\n- [CASR](https://crates.io/crates/casr) — Crash Analysis and Severity Report.\n  \n\n- [Code Pulse](http://code-pulse.com/) — Code Pulse is a free real-time code coverage tool for penetration testing activities by OWASP and Code Dx ([GitHub](https://github.com/codedx/codepulse)).\n  \n\n- [Daikon](https://plse.cs.washington.edu/daikon/) — A dynamic detector of likely invariants. An invariant is a property  that holds at a certain program point, often seen in assert statements,  documentation, and formal specifications.\n  \n\n- [Sydr](https://sydr-fuzz.github.io/) :copyright: — Continuous Hybrid Fuzzing and Dynamic Analysis for Security Development Lifecycle.\n  \n\n## Other\n\n\n\n<h2 id=\"api\">API</h2>\n\n\n\n- [Smartbear](https://smartbear.com/) :copyright: — Test automation and performance testing platform\n  \n\n<h2 id=\"binary\">Binaries</h2>\n\n\n\n- [angr](https://github.com/angr/angr) — Platform agnostic binary analysis framework from UCSB.\n  \n\n- [BOLT](https://github.com/facebookincubator/BOLT) — Binary Optimization and Layout Tool - A linux command-line utility used for optimizing performance of binaries  with profile guided permutation of linking to improve cache efficiency\n  \n\n- [Dr. Memory](https://drmemory.org/) — Dr. Memory is a memory monitoring tool capable of identifying memory-related programming errors ([Github](https://github.com/DynamoRIO/drmemory)).\n  \n\n- [DynamoRIO](http://www.dynamorio.org/) — Is a runtime code manipulation system that supports code transformations on any part of a program, while it executes.\n  \n\n- [llvm-propeller](https://github.com/google/llvm-propeller) — Profile guided hot/cold function splitting to improve cache efficiency. An alternative to BOLT by Facebook\n  \n\n- [Pin Tools](https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool) — A dynamic binary instrumentation tool and a platform for creating analysis tools.\n  \n\n- [TRITON](https://triton.quarkslab.com/) — Dynamic Binary Analysis for x86 binaries.\n  \n\n<h2 id=\"bytecode\">Bytecode/IR</h2>\n\n\n\n- [souper](https://github.com/google/souper) — optimize LLVM IR with SMT solvers\n  \n\n<h2 id=\"cloud\">Cloud</h2>\n\n\n\n- [prowler](https://prowler.pro) — Prowler is an Open Source security tool to perform AWS and Azure security best practices assessments, audits, incident response, continuous monitoring, hardening and forensics readiness.\nIt contains hundreds of controls covering CIS, PCI-DSS, ISO27001, GDPR, HIPAA, FFIEC, SOC2, AWS FTR, ENS and custom security frameworks.\n  \n\n<h2 id=\"container\">Containers</h2>\n\n\n\n- [cadvisor](https://github.com/google/cadvisor) — Analyzes resource usage and performance characteristics of running containers.\n  \n\n<h2 id=\"laravel\">Laravel</h2>\n\n\n\n- [Enlightn](https://www.laravel-enlightn.com/) — A static and dynamic analysis tool for Laravel applications that provides recommendations to improve the performance, security and code reliability of Laravel apps. Contains 120 automated checks.\n  \n\n<h2 id=\"security\">Security/DAST</h2>\n\n\n\n- [AppScan Standard](https://www.hcltechsw.com/products/appscan) :copyright: — HCL's AppScan is a dynamic application security testing suite (previously by IBM)\n  \n\n- [Enlightn](https://www.laravel-enlightn.com/) — A static and dynamic analysis tool for Laravel applications that provides recommendations to improve the performance, security and code reliability of Laravel apps. Contains 120 automated checks.\n  \n\n- [WhiteHat Sentinel Dynamic](https://www.synopsys.com/software-integrity/security-testing/dast.html) :copyright: — Part of the WhiteHat Application Security Platform. Dynamic application security scanner that covers the OWASP Top 10.\n  \n\n<h2 id=\"web\">Web</h2>\n\n\n\n- [Smartbear](https://smartbear.com/) :copyright: — Test automation and performance testing platform\n  \n\n<h2 id=\"webassembly\">WebAssembly</h2>\n\n\n\n- [Wasabi](https://github.com/danleh/wasabi) — Wasabi is a framework for writing dynamic analyses for WebAssembly, written in JavaScript.\n  \n\n<h2 id=\"xml\">XML</h2>\n\n\n\n- [WhiteHat Sentinel Dynamic](https://www.synopsys.com/software-integrity/security-testing/dast.html) :copyright: — Part of the WhiteHat Application Security Platform. Dynamic application security scanner that covers the OWASP Top 10.\n  \n\n## License\n\n[![CC0](https://i.creativecommons.org/p/zero/1.0/88x31.png)](https://creativecommons.org/publicdomain/zero/1.0/)\n\nTo the extent possible under law, [Matthias Endler](https://endler.dev) has waived all copyright and related or neighboring rights to this work.\nThe underlying source code used to format and display that content is licensed under the MIT license.\n\nTitle image [Designed by Freepik](http://www.freepik.com)."
  },
  {
    "path": "data/.gitignore",
    "content": "/target/\n**/*.rs.bk\n.env\n"
  },
  {
    "path": "data/README.md",
    "content": "This is the project's CI environment.\nRead more about the tooling [here](https://matthias-endler.de/2017/obsolete/).  \nWant to add an entry to the list?\nHere's how to [contribute](https://github.com/analysis-tools-dev/static-analysis/blob/master/CONTRIBUTING.md).\n"
  },
  {
    "path": "data/api/tags.json",
    "content": "{\n  \"languages\": [\n    {\n      \"name\": \".NET\",\n      \"value\": \"dotnet\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"ABAP\",\n      \"value\": \"abap\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"ActionScript\",\n      \"value\": \"actionscript\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Active Server Pages\",\n      \"value\": \"asp\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Ada\",\n      \"value\": \"ada\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Assembly\",\n      \"value\": \"asm\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"ASP.NET\",\n      \"value\": \"aspnet\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Apex\",\n      \"value\": \"apex\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Awk\",\n      \"value\": \"awk\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"C\",\n      \"value\": \"c\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Clojure\",\n      \"value\": \"clojure\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"COBOL\",\n      \"value\": \"cobol\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"CoffeeScript\",\n      \"value\": \"coffeescript\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"ColdFusion\",\n      \"value\": \"coldfusion\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"C++\",\n      \"value\": \"cpp\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"C#\",\n      \"value\": \"csharp\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Crystal\",\n      \"value\": \"crystal\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Dart\",\n      \"value\": \"dart\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Dlang\",\n      \"value\": \"dlang\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Delphi\",\n      \"value\": \"delphi\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Elixir\",\n      \"value\": \"elixir\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Elm\",\n      \"value\": \"elm\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Erlang\",\n      \"value\": \"erlang\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"F#\",\n      \"value\": \"fsharp\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Fortran\",\n      \"value\": \"fortran\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Go\",\n      \"value\": \"go\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Groovy\",\n      \"value\": \"groovy\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Haskell\",\n      \"value\": \"haskell\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Haxe\",\n      \"value\": \"haxe\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Java\",\n      \"value\": \"java\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"JavaServer Pages\",\n      \"value\": \"jsp\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"JavaScript\",\n      \"value\": \"javascript\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"JSX\",\n      \"value\": \"jsx\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Julia\",\n      \"value\": \"julia\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Kotlin\",\n      \"value\": \"kotlin\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Lua\",\n      \"value\": \"lua\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"MATLAB\",\n      \"value\": \"matlab\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Objective C\",\n      \"value\": \"objectivec\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Obj-C\",\n      \"value\": \"objectivec\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Perl\",\n      \"value\": \"perl\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"PHP\",\n      \"value\": \"php\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"PL/SQL\",\n      \"value\": \"plsql\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Python\",\n      \"value\": \"python\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"R\",\n      \"value\": \"r\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"RPG\",\n      \"value\": \"rpg\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Ruby\",\n      \"value\": \"ruby\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Rust\",\n      \"value\": \"rust\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Scala\",\n      \"value\": \"scala\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Shell\",\n      \"value\": \"shell\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"SQL\",\n      \"value\": \"sql\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"TSQL\",\n      \"value\": \"tsql\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Swift\",\n      \"value\": \"swift\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Tcl\",\n      \"value\": \"tcl\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"TypeScript\",\n      \"value\": \"typescript\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"VBScript\",\n      \"value\": \"vbscript\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Visual Basic for Applications (VBA)\",\n      \"value\": \"vba\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Visual Basic .NET\",\n      \"value\": \"vbnet\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Visual Basic\",\n      \"value\": \"vbasic\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"PowerShell\",\n      \"value\": \"powershell\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Visualforce\",\n      \"value\": \"visualforce\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Lightning Web Components\",\n      \"value\": \"lwc\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Vim Script\",\n      \"value\": \"vim-script\",\n      \"tag_type\": \"Language\"\n    },\n    {\n      \"name\": \"Zig\",\n      \"value\": \"zig\",\n      \"tag_type\": \"Language\"\n    }\n  ],\n  \"other\": [\n    {\n      \"name\": \"Cloud\",\n      \"value\": \"cloud\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Formatter\",\n      \"value\": \"formatter\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Rails\",\n      \"value\": \"rails\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Smart Contracts\",\n      \"value\": \"smart-contracts\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"API\",\n      \"value\": \"api\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Build tools\",\n      \"value\": \"buildtool\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Binaries\",\n      \"value\": \"binary\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Bytecode/IR\",\n      \"value\": \"bytecode\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"More collections\",\n      \"value\": \"collection\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Containers\",\n      \"value\": \"container\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Config Files\",\n      \"value\": \"configfile\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Configuration Management\",\n      \"value\": \"configmanagement\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Continuous Integration\",\n      \"value\": \"ci\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"CSS/SASS/SCSS\",\n      \"value\": \"css\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Deno\",\n      \"value\": \"deno\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Gherkin\",\n      \"value\": \"gherkin\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Haml\",\n      \"value\": \"haml\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"HTML\",\n      \"value\": \"html\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"IDE Plugins\",\n      \"value\": \"ide\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"JSON\",\n      \"value\": \"json\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Laravel\",\n      \"value\": \"laravel\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"LaTeX\",\n      \"value\": \"latex\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Less\",\n      \"value\": \"less\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Makefiles\",\n      \"value\": \"make\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Markdown\",\n      \"value\": \"markdown\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Metalinter\",\n      \"value\": \"meta\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Mobile\",\n      \"value\": \"mobile\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Node.js\",\n      \"value\": \"nodejs\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Packages\",\n      \"value\": \"package\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"PhoneGap\",\n      \"value\": \"phonegap\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Protocol Buffers\",\n      \"value\": \"protobuf\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Security/DAST\",\n      \"value\": \"security\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Support\",\n      \"value\": \"support\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Template-Languages\",\n      \"value\": \"template\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Translation\",\n      \"value\": \"translation\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Vue.js\",\n      \"value\": \"vue\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Vyper (Smart contract)\",\n      \"value\": \"vyper\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Writing\",\n      \"value\": \"writing\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"Web\",\n      \"value\": \"web\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"WebAssembly\",\n      \"value\": \"webassembly\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"XML\",\n      \"value\": \"xml\",\n      \"tag_type\": \"Other\"\n    },\n    {\n      \"name\": \"YAML\",\n      \"value\": \"yaml\",\n      \"tag_type\": \"Other\"\n    }\n  ]\n}"
  },
  {
    "path": "data/api/tools.json",
    "content": "{\n  \"allocscope\": {\n    \"name\": \"allocscope\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\",\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"GPL-3.0\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/matt-kimball/allocscope\",\n    \"source\": \"https://github.com/matt-kimball/allocscope\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"allocscope is a tool for tracking down where the most egregiously large allocations are occurring in a C, C++ or Rust codebase. It is particularly intendend to be useful for developers who want to get a handle on excessive allocations and are working in a large codebase with multiple contributors with allocations occuring in many modules or libraries.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"angr\": {\n    \"name\": \"angr\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"binary\"\n    ],\n    \"licenses\": [\n      \"BSD-2-Clause License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/angr/angr\",\n    \"source\": \"https://github.com/angr/angr\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Platform agnostic binary analysis framework from UCSB.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"appscan-standard\": {\n    \"name\": \"AppScan Standard\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"security\"\n    ],\n    \"licenses\": [\n      \"proprietary\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://www.hcltechsw.com/products/appscan\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"HCL's AppScan is a dynamic application security testing suite (previously by IBM)\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"bolt\": {\n    \"name\": \"BOLT\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"binary\"\n    ],\n    \"licenses\": [\n      \"LLVM Release License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/facebookincubator/BOLT\",\n    \"source\": \"https://github.com/facebookincubator/BOLT\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Binary Optimization and Layout Tool - A linux command-line utility used for optimizing performance of binaries  with profile guided permutation of linking to improve cache efficiency\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"bytehound\": {\n    \"name\": \"bytehound\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\",\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"NOASSERTION\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/koute/bytehound\",\n    \"source\": \"https://github.com/koute/bytehound\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A memory profiler for Linux. Can be used to analyze memory leaks, see where exactly the memory is being consumed, identify temporary allocations and investigate excessive memory fragmentation.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"cadvisor\": {\n    \"name\": \"cadvisor\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"container\"\n    ],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/google/cadvisor\",\n    \"source\": \"https://github.com/google/cadvisor\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Analyzes resource usage and performance characteristics of running containers.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"cargo-careful\": {\n    \"name\": \"cargo-careful\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache-2.0\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/RalfJung/cargo-careful\",\n    \"source\": \"https://github.com/RalfJung/cargo-careful\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Execute Rust code carefully, with extra checking along the way. It builds the standard library with debug assertions.\\nHere are some of the checks this enables:\\n* `get_unchecked` in slices performs bounds checks * `copy`, `copy_nonoverlapping`, and `write_bytes` check that pointers are aligned and non-null and (if applicable) non-overlapping `{NonNull,NonZero*,...}::new_unchecked` check that the value is valid * plenty of internal consistency checks in the collection types * mem::zeroed and the deprecated mem::uninitialized panic if the type does not allow that kind of initialization\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"casr\": {\n    \"name\": \"CASR\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\",\n      \"go\",\n      \"rust\",\n      \"swift\"\n    ],\n    \"other\": [\n      \"security\"\n    ],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://crates.io/crates/casr\",\n    \"source\": \"https://github.com/ispras/casr\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Crash Analysis and Severity Report.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"chap\": {\n    \"name\": \"CHAP\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"GPL v2\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/vmware/chap\",\n    \"source\": \"https://github.com/vmware/chap\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Analyzes un-instrumented ELF core files for leaks, memory growth, and corruption. It helps explain memory growth, can identify some forms of corruption, and  supplements a debugger by giving the status of various memory locations.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"code-pulse\": {\n    \"name\": \"Code Pulse\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"dotnet\",\n      \"java\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"http://code-pulse.com/\",\n    \"source\": \"https://github.com/codedx/codepulse\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Code Pulse is a free real-time code coverage tool for penetration testing activities by OWASP and Code Dx ([GitHub](https://github.com/codedx/codepulse)).\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"crosshair\": {\n    \"name\": \"CrossHair\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"python\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/pschanely/CrossHair\",\n    \"source\": \"https://github.com/pschanely/CrossHair\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Symbolic execution engine for testing Python contracts.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"daikon\": {\n    \"name\": \"Daikon\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\",\n      \"java\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"NOASSERTION\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://plse.cs.washington.edu/daikon/\",\n    \"source\": \"https://github.com/codespecs/daikon\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A dynamic detector of likely invariants. An invariant is a property  that holds at a certain program point, often seen in assert statements,  documentation, and formal specifications.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"dr-memory\": {\n    \"name\": \"Dr. Memory\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"binary\"\n    ],\n    \"licenses\": [\n      \"LGPL License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://drmemory.org/\",\n    \"source\": \"https://github.com/DynamoRIO/drmemory\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Dr. Memory is a memory monitoring tool capable of identifying memory-related programming errors ([Github](https://github.com/DynamoRIO/drmemory)).\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"dynamorio\": {\n    \"name\": \"DynamoRIO\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"binary\"\n    ],\n    \"licenses\": [\n      \"BSD License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"http://www.dynamorio.org/\",\n    \"source\": \"https://github.com/DynamoRIO/dynamorio\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Is a runtime code manipulation system that supports code transformations on any part of a program, while it executes.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"dynapyt\": {\n    \"name\": \"DynaPyt\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"python\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/sola-st/DynaPyt\",\n    \"source\": \"https://github.com/sola-st/DynaPyt\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"DynaPyt is a framework for writing dynamic analyses for Python. The analyses can also modify runtime values to alter the execution.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"enlightn\": {\n    \"name\": \"Enlightn\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"php\"\n    ],\n    \"other\": [\n      \"laravel\",\n      \"security\"\n    ],\n    \"licenses\": [\n      \"LGPL-3.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://www.laravel-enlightn.com/\",\n    \"source\": \"https://github.com/enlightn/enlightn\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A static and dynamic analysis tool for Laravel applications that provides recommendations to improve the performance, security and code reliability of Laravel apps. Contains 120 automated checks.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"hyperfine\": {\n    \"name\": \"hyperfine\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache-2.0\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/sharkdp/hyperfine\",\n    \"source\": \"https://github.com/sharkdp/hyperfine\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A command-line benchmarking tool It features statistical analysis across multiple runs, support for arbitrary shell commands, constant feedback about the benchmark progress and current estimates, warmup runs, a simple and expressive syntax, and more.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"icontract\": {\n    \"name\": \"icontract\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"python\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/Parquery/icontract\",\n    \"source\": \"https://github.com/Parquery/icontract\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Design-by-contract library supporting behavioral subtyping\\nThere is also a wider tooling around the icontract library such as  a linter (pyicontract-lint) and a plug-in for Sphinx (sphinx-icontract).\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"iroh-js\": {\n    \"name\": \"Iroh.js\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"javascript\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/maierfelix/Iroh\",\n    \"source\": \"https://github.com/maierfelix/Iroh\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A dynamic code analysis tool for JavaScript. Iroh allows to record your code flow in realtime, intercept runtime informations and manipulate program behaviour on the fly.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"jalangi2\": {\n    \"name\": \"Jalangi2\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"javascript\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/Samsung/jalangi2\",\n    \"source\": \"https://github.com/Samsung/jalangi2\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Jalangi2 is a popular framework for writing dynamic analyses for JavaScript.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"java-pathfinder\": {\n    \"name\": \"Java PathFinder\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"java\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/javapathfinder/jpf-core\",\n    \"source\": \"https://github.com/javapathfinder/jpf-core\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"An extensible software model checking framework for Java bytecode programs.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"klee\": {\n    \"name\": \"KLEE\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/klee/klee\",\n    \"source\": \"https://github.com/klee/klee\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Symbolic virtual machine built on top of the LLVM compiler infrastructure.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"ldra\": {\n    \"name\": \"LDRA\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"proprietary\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://ldra.com\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A tool suite including dynamic analysis and test to various standards can ensure test coverage to 100% op-code, branch & decsion coverage.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"llvm-clang-sanitizers\": {\n    \"name\": \"LLVM/Clang Sanitizers\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/google/sanitizers\",\n    \"source\": \"https://github.com/google/sanitizers\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"<ul> <li><a href=\\\"https://github.com/google/sanitizers/wiki/AddressSanitizer\\\">AddressSanitizer</a> - A memory error detector for C/C++</li> <li><a href=\\\"https://github.com/google/sanitizers/wiki/MemorySanitizer\\\">MemorySanitizer</a> - A detector of uninitialized memory reads in C/C++ programs.</li> <li><a href=\\\"https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual\\\">ThreadSanitizer</a> - A data race detector for C/C++</li> </ul>\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"llvm-propeller\": {\n    \"name\": \"llvm-propeller\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"binary\"\n    ],\n    \"licenses\": [\n      \"Apache 2.0\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/google/llvm-propeller\",\n    \"source\": \"https://github.com/google/llvm-propeller\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Profile guided hot/cold function splitting to improve cache efficiency. An alternative to BOLT by Facebook\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"loom\": {\n    \"name\": \"loom\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/tokio-rs/loom\",\n    \"source\": \"https://github.com/tokio-rs/loom\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Concurrency permutation testing tool for Rust.  It runs a test many times, permuting the possible concurrent executions of that test.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"microsoft-intellitest\": {\n    \"name\": \"Microsoft IntelliTest\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"dotnet\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://docs.microsoft.com/en-us/visualstudio/test/intellitest-manual/getting-started?view=vs-2019\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Generate a candidate suite of tests for your .NET code.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"miri\": {\n    \"name\": \"MIRI\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/rust-lang/miri\",\n    \"source\": \"https://github.com/rust-lang/miri\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"An interpreter for Rust's mid-level intermediate representation, which can detect certain classes of undefined behavior like out-of-bounds memory accesses and use-after-free.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"parasoft-jtest\": {\n    \"name\": \"Parasoft Jtest\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"java\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"proprietary\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://www.parasoft.com/products/jtest\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Jtest is an automated Java software testing and static analysis product that is made by Parasoft. The product includes technology for Data-flow analysis Unit test-case generation and execution, static analysis, regression testing, code coverage, and runtime error detection.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"pex-and-moles\": {\n    \"name\": \"Pex and Moles\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"dotnet\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://www.microsoft.com/en-us/research/project/pex-and-moles-isolation-and-white-box-unit-testing-for-net/\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Pex automatically generates test suites with high code coverage using automated white box analysis.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"pin-tools\": {\n    \"name\": \"Pin Tools\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"binary\"\n    ],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A dynamic binary instrumentation tool and a platform for creating analysis tools.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"poop\": {\n    \"name\": \"poop\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"zig\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/andrewrk/poop\",\n    \"source\": \"https://github.com/andrewrk/poop\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Performance Optimizer Observation Platform This command line tool uses Linux's `perf_event_open` functionality to compare the performance of multiple commands with a colorful terminal user interface. It is similar to `hyperfine`.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"prowler\": {\n    \"name\": \"prowler\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"cloud\"\n    ],\n    \"licenses\": [\n      \"Apache-2.0 license\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://prowler.pro\",\n    \"source\": \"https://github.com/prowler-cloud/prowler\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Prowler is an Open Source security tool to perform AWS and Azure security best practices assessments, audits, incident response, continuous monitoring, hardening and forensics readiness.\\nIt contains hundreds of controls covering CIS, PCI-DSS, ISO27001, GDPR, HIPAA, FFIEC, SOC2, AWS FTR, ENS and custom security frameworks.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": [\n      {\n        \"title\": \"Prowler Introduction\",\n        \"url\": \"https://www.youtube.com/watch?v=Oo5e45NCKFw\"\n      }\n    ],\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"puffin\": {\n    \"name\": \"puffin\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/EmbarkStudios/puffin\",\n    \"source\": \"https://github.com/EmbarkStudios/puffin\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Instrumentation profiler for Rust.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"rust-san\": {\n    \"name\": \"rust-san\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache 2.0 / MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/japaric/rust-san\",\n    \"source\": \"https://github.com/japaric/rust-san\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"How-to sanitize your Rust code with built-in Rust dynamic analyzers\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"scalene\": {\n    \"name\": \"Scalene\",\n    \"categories\": [\n      \"profiler\"\n    ],\n    \"languages\": [\n      \"python\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/emeryberger/scalene\",\n    \"source\": \"https://github.com/emeryberger/scalene\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A high-performance, high-precision CPU and memory profiler for Python\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"smartbear\": {\n    \"name\": \"Smartbear\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"api\",\n      \"web\"\n    ],\n    \"licenses\": [\n      \"proprietary\"\n    ],\n    \"types\": [\n      \"service\"\n    ],\n    \"homepage\": \"https://smartbear.com/\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Test automation and performance testing platform\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"souper\": {\n    \"name\": \"souper\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"bytecode\"\n    ],\n    \"licenses\": [\n      \"Apache 2.0\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/google/souper\",\n    \"source\": \"https://github.com/google/souper\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"optimize LLVM IR with SMT solvers\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"statsviz\": {\n    \"name\": \"statsviz\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"go\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/arl/statsviz\",\n    \"source\": \"https://github.com/arl/statsviz\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Instant live visualization of your Go application runtime statistics in the browser. It plots heap usage, MSpans/MCaches, Object counts, Goroutines and GC/CPU fraction.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"stuck\": {\n    \"name\": \"stuck\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"rust\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/jonhoo/stuck\",\n    \"source\": \"https://github.com/jonhoo/stuck\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"provides a visualization for quickly identifying common bottlenecks in running, asynchronous, and concurrent applications.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"suture\": {\n    \"name\": \"suture\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"ruby\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/testdouble/suture\",\n    \"source\": \"https://github.com/testdouble/suture\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"A Ruby gem that helps you refactor your legacy code  by the result of some old behavior with a new version.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"sydr\": {\n    \"name\": \"Sydr\",\n    \"categories\": [\n      \"linter\",\n      \"fuzzer\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\",\n      \"go\",\n      \"rust\",\n      \"swift\"\n    ],\n    \"other\": [\n      \"security\"\n    ],\n    \"licenses\": [\n      \"proprietary\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://sydr-fuzz.github.io/\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Continuous Hybrid Fuzzing and Dynamic Analysis for Security Development Lifecycle.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": [\n      {\n        \"title\": \"Sydr - Cutting Dynamic Symbolic Execution\",\n        \"url\": \"https://www.ispras.ru/conf/2020/video/compiler-technology-11-december.mp4#t=6021\"\n      }\n    ],\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"triton\": {\n    \"name\": \"TRITON\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"binary\"\n    ],\n    \"licenses\": [\n      \"Apache-2.0 License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://triton.quarkslab.com/\",\n    \"source\": \"https://github.com/JonathanSalwan/Triton\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Dynamic Binary Analysis for x86 binaries.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"typo\": {\n    \"name\": \"typo\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"python\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"MIT License\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/aldanor/typo\",\n    \"source\": \"https://github.com/aldanor/typo\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Runtime Type Checking for Python 3.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"valgrind\": {\n    \"name\": \"Valgrind\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"c\",\n      \"cpp\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"GNU General Public License v2\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://valgrind.org/\",\n    \"source\": \"https://sourceware.org/git/?p=valgrind.git\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"An instrumentation framework for building dynamic analysis tools.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"vb-watch\": {\n    \"name\": \"VB Watch\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"vbasic\"\n    ],\n    \"other\": [],\n    \"licenses\": [\n      \"proprietary\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://www.aivosto.com/vbwatch.html\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Profiler, Protector and Debugger for VB6. Profiler measures performance and test coverage. Protector implements robust error handling. Debugger helps monitor your executables.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"wasabi\": {\n    \"name\": \"Wasabi\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [],\n    \"other\": [\n      \"webassembly\"\n    ],\n    \"licenses\": [\n      \"MIT\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://github.com/danleh/wasabi\",\n    \"source\": \"https://github.com/danleh/wasabi\",\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Wasabi is a framework for writing dynamic analyses for WebAssembly, written in JavaScript.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  },\n  \"whitehat-sentinel-dynamic\": {\n    \"name\": \"WhiteHat Sentinel Dynamic\",\n    \"categories\": [\n      \"linter\"\n    ],\n    \"languages\": [\n      \"sql\"\n    ],\n    \"other\": [\n      \"security\",\n      \"xml\"\n    ],\n    \"licenses\": [\n      \"proprietary\"\n    ],\n    \"types\": [\n      \"cli\"\n    ],\n    \"homepage\": \"https://www.synopsys.com/software-integrity/security-testing/dast.html\",\n    \"source\": null,\n    \"pricing\": null,\n    \"plans\": null,\n    \"description\": \"Part of the WhiteHat Application Security Platform. Dynamic application security scanner that covers the OWASP Top 10.\",\n    \"discussion\": null,\n    \"deprecated\": null,\n    \"resources\": null,\n    \"reviews\": null,\n    \"demos\": null,\n    \"wrapper\": null\n  }\n}"
  },
  {
    "path": "data/render/.gitignore",
    "content": "target\n"
  },
  {
    "path": "data/render/Cargo.toml",
    "content": "[package]\nname = \"render\"\nversion = \"0.2.0\"\nauthors = [\"Matthias Endler <matthias-endler@gmx.net>\"]\nedition = \"2018\"\n\n[dependencies]\nserde = \"1.0.228\"\nserde_derive = \"1.0.136\"\nserde_yaml = \"0.9.34\"\naskama = \"0.12.1\"\n# Switch back to crates as soon as a new release with tokio 1.x support is\n# released. See https://github.com/softprops/hubcaps/pull/285\nhubcaps = { git=\"https://github.com/softprops/hubcaps\" }\ntokio = { version = \"1.26.0\", features = [\"rt-multi-thread\", \"macros\"] }\nchrono = \"0.4.43\"\nanyhow = \"1.0.102\"\npico-args = \"0.5.0\"\nserde_json = \"1.0.149\"\nslug = \"0.1.6\"\n"
  },
  {
    "path": "data/render/clippy.toml",
    "content": "# Clippy configuration for stricter linting\n# https://rust-lang.github.io/rust-clippy/master/index.html\n\n# Set the threshold for too many arguments\ntoo-many-arguments-threshold = 4\n\n# Set the threshold for too many lines\ntoo-many-lines-threshold = 100\n\n# Set the threshold for type complexity\ntype-complexity-threshold = 250\n\n# Avoid suggesting wildcard imports\navoid-breaking-exported-api = false"
  },
  {
    "path": "data/render/src/bin/main.rs",
    "content": "use anyhow::{Context, Result};\nuse askama::Template;\nuse pico_args::Arguments;\nuse render::types::{Entry, ParsedEntry, Tag, Tags, Type};\nuse render::{check_deprecated, create_api, create_catalog};\nuse std::collections::BTreeMap;\nuse std::env;\nuse std::ffi::OsStr;\nuse std::fs;\nuse std::io;\nuse std::path::PathBuf;\n\nstruct Args {\n    tags: PathBuf,\n    tools: PathBuf,\n    md_out: PathBuf,\n    json_out: PathBuf,\n    skip_deprecated: bool,\n}\n\nfn parse_path(s: &OsStr) -> Result<PathBuf> {\n    Ok(s.into())\n}\n\nfn read_tags(path: PathBuf) -> Result<Tags> {\n    let f = std::fs::File::open(path)?;\n    Ok(serde_yaml::from_reader(f)?)\n}\n\nfn read_tools(path: PathBuf) -> Result<Vec<ParsedEntry>> {\n    let dir: std::fs::ReadDir = std::fs::read_dir(path)?;\n\n    let files = dir\n        .map(|res| res.map(|e| e.path()))\n        .filter(|x| match x {\n            Ok(pb) => pb.extension().and_then(OsStr::to_str) == Some(\"yml\"),\n            Err(_) => false,\n        })\n        .collect::<Result<Vec<_>, io::Error>>()?;\n\n    files\n        .iter()\n        .inspect(|p| println!(\"Checking {}\", p.display()))\n        .map(|p| {\n            let file = std::fs::File::open(p)?;\n            let entry: ParsedEntry = serde_yaml::from_reader(file)?;\n            Ok(entry)\n        })\n        .collect::<Result<Vec<ParsedEntry>, _>>()\n}\n\nfn main() -> Result<()> {\n    let mut args = Arguments::from_env();\n    let args = Args {\n        tags: args.value_from_os_str(\"--tags\", parse_path)?,\n        tools: args.value_from_os_str(\"--tools\", parse_path)?,\n        md_out: args.value_from_os_str(\"--md-out\", parse_path)?,\n        json_out: args.value_from_os_str(\"--json-out\", parse_path)?,\n        skip_deprecated: args.contains(\"--skip-deprecated\"),\n    };\n\n    let tags = read_tags(args.tags)?;\n\n    let parsed_tools = read_tools(args.tools)?;\n    let tools: Result<Vec<Entry>> = parsed_tools\n        .into_iter()\n        .map(|t| Entry::from_parsed(t, &tags))\n        .collect();\n    let mut tools = tools?;\n    tools.sort();\n\n    if !args.skip_deprecated {\n        if let Ok(token) = env::var(\"GITHUB_TOKEN\") {\n            check_deprecated(token, &mut tools)?;\n        }\n    }\n\n    let languages: Vec<Tag> = tags\n        .clone()\n        .into_iter()\n        .filter(|t| t.tag_type == Type::Language)\n        .collect();\n\n    let other_tags: Vec<Tag> = tags\n        .clone()\n        .into_iter()\n        .filter(|t| t.tag_type == Type::Other)\n        .collect();\n\n    let catalog = create_catalog(&tools, &languages, &other_tags)?;\n    fs::write(&args.md_out, catalog.render()?).context(format!(\n        \"Cannot write Markdown output to {}\",\n        args.md_out.display()\n    ))?;\n\n    let api = create_api(catalog, &languages, &other_tags)?;\n\n    let json = serde_json::to_string_pretty(&api)?;\n    let tools_out = args.json_out.join(\"tools.json\");\n    fs::write(&tools_out, json).context(format!(\n        \"Cannot write tools JSON output to {}\",\n        args.json_out.display()\n    ))?;\n\n    let mut tags_json = BTreeMap::new();\n    tags_json.insert(\"languages\", languages);\n    tags_json.insert(\"other\", other_tags);\n    let json = serde_json::to_string_pretty(&tags_json)?;\n\n    let tags_out = args.json_out.join(\"tags.json\");\n    fs::write(&tags_out, json).context(format!(\n        \"Cannot write tags JSON output to {}\",\n        args.json_out.display()\n    ))?;\n\n    // let stats_raw = fs::read_to_string(\"data/api/stats_raw.json\")?;\n    // let stats: StatsRaw = serde_json::from_str(&stats_raw)?;\n\n    // let stats = format_stats(stats);\n    // let json = serde_json::to_string(&stats)?;\n\n    // let stats_out = args.json_out.join(\"stats.json\");\n    // fs::write(&stats_out, json).context(format!(\n    //     \"Cannot write stats JSON output to {}\",\n    //     args.json_out.display()\n    // ))?;\n\n    Ok(())\n}\n"
  },
  {
    "path": "data/render/src/lib.rs",
    "content": "#[macro_use]\nextern crate serde_derive;\n\nuse anyhow::Result;\nuse chrono::{DateTime, Local, NaiveDateTime, Utc};\nuse hubcaps::{Credentials, Github};\nuse slug::slugify;\nuse stats::StatsRaw;\n\nmod lints;\npub mod stats;\npub mod types;\n\nuse std::{collections::BTreeMap, iter::FromIterator};\nuse types::{Api, ApiEntry, Catalog, Entry, ParsedEntry, Tag, Type};\n\nfn valid(entry: &ParsedEntry, tags: &[Tag]) -> Result<()> {\n    let lints = [lints::name, lints::min_one_tag];\n    lints.iter().try_for_each(|lint| lint(entry, tags))\n}\n\n#[tokio::main]\npub async fn check_deprecated(token: String, entries: &mut Vec<Entry>) -> Result<()> {\n    println!(\"Checking for deprecated entries on Github. This might take a while...\");\n    let github = Github::new(\n        String::from(\"analysis tools bot\"),\n        Credentials::Token(token),\n    )?;\n\n    for entry in entries {\n        if entry.source.is_none() {\n            continue;\n        }\n\n        let components: Vec<&str> = entry\n            .source\n            .as_ref()\n            .unwrap()\n            .trim_end_matches('/')\n            .split('/')\n            .collect();\n        if !(components.contains(&\"github.com\") && components.len() == 5) {\n            // valid github source must have 5 elements - anything longer and they are probably a\n            // reference to a path inside a repo, rather than a repo itself.\n            continue;\n        }\n\n        let owner = components[3];\n        let repo = components[4];\n\n        if let Ok(commit_list) = github.repo(owner, repo).commits().list(\"\").await {\n            let date = &commit_list[0].commit.author.date;\n            let last_commit = NaiveDateTime::parse_from_str(date, \"%Y-%m-%dT%H:%M:%SZ\")?;\n            let last_commit_utc: DateTime<Utc> = DateTime::from_naive_utc_and_offset(last_commit, Utc);\n            let duration = Local::now().date_naive().signed_duration_since(last_commit_utc.date_naive());\n\n            if duration.num_days() > 365 {\n                entry.deprecated = Some(true);\n            } else {\n                entry.deprecated = None;\n            }\n        }\n    }\n\n    Ok(())\n}\n\npub fn create_catalog(entries: &[Entry], languages: &[Tag], other_tags: &[Tag]) -> Result<Catalog> {\n    // Move tools that support multiple programming languages into their own category\n    let (multi, entries): (Vec<Entry>, Vec<Entry>) = entries.iter().cloned().partition(|entry| {\n        let language_tags = entry\n            .tags\n            .iter()\n            .filter(|t| t.tag_type == Type::Language)\n            .count();\n        language_tags > 1 && !entry.is_c_cpp()\n    });\n\n    let mut linters = BTreeMap::new();\n    for language in languages {\n        let list: Vec<Entry> = entries\n            .iter()\n            .filter(|e| e.tags.contains(language))\n            .cloned()\n            .collect();\n        if !list.is_empty() {\n            linters.insert(language.clone(), list);\n        }\n    }\n\n    let mut others = BTreeMap::new();\n    for other in other_tags {\n        let list: Vec<Entry> = entries\n            .iter()\n            .filter(|e| e.tags.contains(other))\n            .cloned()\n            .collect();\n        if !list.is_empty() {\n            others.insert(other.clone(), list);\n        }\n    }\n\n    Ok(Catalog {\n        linters,\n        others,\n        multi,\n    })\n}\n\npub fn create_api(catalog: Catalog, languages: &[Tag], other_tags: &[Tag]) -> Result<Api> {\n    let mut api_entries = BTreeMap::new();\n\n    // Concatenate all entries into one vector\n    let mut entries: Vec<Entry> = Vec::from_iter(catalog.linters.into_values().flatten());\n    entries.extend(Vec::from_iter(catalog.others.into_values().flatten()));\n    entries.extend(catalog.multi);\n\n    for entry in entries {\n        // Get the language data for the entry. We iterate over all languages\n        // and look up each language in the entry tags This is an O(n) operation\n        // as we iterate over the language list only once while the lookup is an\n        // O(1) operation thanks to the tag hash set.\n        let entry_languages = languages\n            .iter()\n            .filter_map(|lang| {\n                if entry.tags.contains(lang) {\n                    entry.tags.get(lang).map(|tag| tag.value.clone())\n                } else {\n                    None\n                }\n            })\n            .collect();\n\n        // ...same for the non-language tags\n        let entry_other = other_tags\n            .iter()\n            .filter_map(|other| {\n                if entry.tags.contains(other) {\n                    entry.tags.get(other).map(|tag| tag.value.clone())\n                } else {\n                    None\n                }\n            })\n            .collect();\n\n        // In the future we want to split up licenses in the YAML input files into a list.\n        // Emulate the future data format by creating a list from the current string.\n        // Note that this string could contain more than one license name for now, e.g.\n        // MIT / Apache License\n        let licenses = vec![entry.license];\n\n        let api_entry = ApiEntry {\n            name: entry.name.clone(),\n            categories: entry.categories,\n            languages: entry_languages,\n            other: entry_other,\n            licenses,\n            types: entry.types,\n            homepage: entry.homepage,\n            source: entry.source,\n            pricing: entry.pricing,\n            plans: entry.plans,\n            description: entry.description,\n            discussion: entry.discussion,\n            deprecated: entry.deprecated,\n            resources: entry.resources,\n            reviews: entry.reviews,\n            demos: entry.demos,\n            wrapper: entry.wrapper,\n        };\n        api_entries.insert(slugify(&entry.name), api_entry);\n    }\n\n    Ok(api_entries)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_slugify() {\n        assert_eq!(slugify(\"this is a test\"), \"this-is-a-test\".to_string());\n        assert_eq!(slugify(\"Big\"), \"big\".to_string());\n        assert_eq!(slugify(\"   Big\"), \"big\".to_string());\n        assert_eq!(slugify(\"Astrée\"), \"astree\".to_string());\n        assert_eq!(slugify(\"non word 1234\"), \"non-word-1234\".to_string());\n        assert_eq!(slugify(\"it-has-dashes\"), \"it-has-dashes\".to_string());\n        assert_eq!(\n            slugify(\"   - - it-has-dashes - -\"),\n            \"it-has-dashes\".to_string()\n        );\n    }\n}\n\npub fn format_stats(stats: StatsRaw) -> BTreeMap<String, String> {\n    stats\n        .data\n        .result\n        .into_iter()\n        .map(|r| {\n            (\n                r.metric.path.trim_start_matches(\"/tool/\").to_string(),\n                r.value.1,\n            )\n        })\n        .collect()\n}\n"
  },
  {
    "path": "data/render/src/lints.rs",
    "content": "use anyhow::{anyhow, Result};\n\nuse crate::types::ParsedEntry;\nuse crate::types::Tag;\n\npub fn name(entry: &ParsedEntry, _: &[Tag]) -> Result<()> {\n    match entry.name.len() <= 50 {\n        true => Ok(()),\n        false => Err(anyhow!(\n            \"Name of entry may be at most 50 characters long, but {} is {} long\",\n            entry.name,\n            entry.name.len()\n        )),\n    }\n}\n\npub fn min_one_tag(entry: &ParsedEntry, _: &[Tag]) -> Result<()> {\n    match entry.tags.is_empty() {\n        true => Err(anyhow!(\n            \"{} must have at least one tag from `tags.yml`.\",\n            entry.name\n        )),\n        false => Ok(()),\n    }\n}\n"
  },
  {
    "path": "data/render/src/stats.rs",
    "content": "use serde_derive::Deserialize;\nuse serde_derive::Serialize;\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct StatsRaw {\n    pub status: String,\n    pub data: Data,\n}\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct Data {\n    pub result_type: String,\n    pub result: Vec<Result>,\n    pub stats: Stats,\n}\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct Result {\n    pub metric: Metric,\n    pub value: (f64, String),\n}\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct Metric {\n    pub path: String,\n}\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct Stats {\n    pub summary: Summary,\n    pub store: Store,\n    pub ingester: Ingester,\n}\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct Summary {\n    pub bytes_processed_per_second: i64,\n    pub lines_processed_per_second: i64,\n    pub total_bytes_processed: i64,\n    pub total_lines_processed: i64,\n    pub exec_time: f64,\n}\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct Store {\n    pub total_chunks_ref: i64,\n    pub total_chunks_downloaded: i64,\n    pub chunks_download_time: f64,\n    pub head_chunk_bytes: i64,\n    pub head_chunk_lines: i64,\n    pub decompressed_bytes: i64,\n    pub decompressed_lines: i64,\n    pub compressed_bytes: i64,\n    pub total_duplicates: i64,\n}\n\n#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct Ingester {\n    pub total_reached: i64,\n    pub total_chunks_matched: i64,\n    pub total_batches: i64,\n    pub total_lines_sent: i64,\n    pub head_chunk_bytes: i64,\n    pub head_chunk_lines: i64,\n    pub decompressed_bytes: i64,\n    pub decompressed_lines: i64,\n    pub compressed_bytes: i64,\n    pub total_duplicates: i64,\n}\n"
  },
  {
    "path": "data/render/src/types.rs",
    "content": "use anyhow::{bail, Result};\nuse askama::Template;\nuse serde::Deserialize;\nuse std::cmp::Ordering;\nuse std::collections::{BTreeMap, BTreeSet};\n\nuse crate::valid;\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Ord, PartialOrd)]\npub enum Type {\n    #[serde(alias = \"language\")]\n    Language,\n    #[serde(alias = \"other\")]\n    Other,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Ord, PartialOrd)]\npub struct Tag {\n    pub name: String,\n    pub value: String,\n    #[serde(alias = \"type\")]\n    pub tag_type: Type,\n}\n\nimpl Tag {\n    fn new(name: &str, value: &str, tag_type: Type) -> Tag {\n        Tag {\n            name: name.into(),\n            value: value.into(),\n            tag_type,\n        }\n    }\n}\n\n// The tags from tags.yml. Note that this is a `Vector<Tag>` and not a\n// `BTreeSet<Tag>` because we like to keep the sorting between renders.\npub type Tags = Vec<Tag>;\n\npub type EntryTags = BTreeSet<String>;\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]\npub struct Resource {\n    title: String,\n    url: String,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]\npub struct Review {\n    url: String,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]\npub struct Demo {\n    url: String,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Ord, PartialOrd)]\n#[serde(rename = \"category\")]\npub enum Category {\n    #[serde(rename = \"linter\")]\n    Linter,\n    #[serde(rename = \"formatter\")]\n    Formatter,\n    #[serde(rename = \"fuzzer\")]\n    Fuzzer,\n    #[serde(rename = \"profiler\")]\n    Profiler,\n    #[serde(rename = \"meta\")]\n    Meta,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]\npub struct ParsedEntry {\n    pub name: String,\n    pub categories: BTreeSet<Category>,\n    pub tags: BTreeSet<String>,\n    pub license: String,\n    pub types: BTreeSet<String>,\n    pub homepage: String,\n    pub source: Option<String>,\n    pub pricing: Option<String>,\n    pub plans: Option<BTreeMap<String, bool>>,\n    pub description: String,\n    pub discussion: Option<String>,\n    pub deprecated: Option<bool>,\n    pub resources: Option<Vec<Resource>>,\n    pub reviews: Option<BTreeSet<String>>,\n    pub demos: Option<BTreeSet<String>>,\n    pub wrapper: Option<bool>,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Ord, PartialOrd)]\npub enum ToolType {\n    #[serde(rename = \"cli\")]\n    Commandline,\n    #[serde(rename = \"service\")]\n    Service,\n    #[serde(rename = \"ide-plugin\")]\n    IdePlugin,\n}\n\n#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]\npub struct Entry {\n    pub name: String,\n    pub categories: BTreeSet<Category>,\n    pub tags: BTreeSet<Tag>,\n    pub license: String,\n    pub types: BTreeSet<ToolType>,\n    pub homepage: String,\n    pub source: Option<String>,\n    pub pricing: Option<String>,\n    pub plans: Option<BTreeMap<String, bool>>,\n    pub description: String,\n    pub discussion: Option<String>,\n    pub deprecated: Option<bool>,\n    pub resources: Option<Vec<Resource>>,\n    pub reviews: Option<BTreeSet<String>>,\n    pub demos: Option<BTreeSet<String>>,\n    pub wrapper: Option<bool>,\n}\n\nimpl Entry {\n    pub fn is_c_cpp(&self) -> bool {\n        self.tags\n            == [\n                Tag::new(\"C\", \"c\", Type::Language),\n                Tag::new(\"C++\", \"cpp\", Type::Language),\n            ]\n            .iter()\n            .cloned()\n            .collect::<BTreeSet<Tag>>()\n    }\n\n    pub fn from_parsed(p: ParsedEntry, tags: &[Tag]) -> Result<Entry> {\n        valid(&p, tags)?;\n        let entry_tags: Result<BTreeSet<Tag>> = p.tags.iter().map(|t| get_tag(t, tags)).collect();\n        let types: Result<BTreeSet<ToolType>> = p\n            .types\n            .iter()\n            .map(|t| {\n                serde_json::from_value::<ToolType>(serde_json::to_value(t).unwrap())\n                    .map_err(|e| e.into())\n            })\n            .collect();\n\n        Ok(Entry {\n            name: p.name,\n            categories: p.categories,\n            tags: entry_tags?,\n            license: p.license,\n            types: types?,\n            homepage: p.homepage,\n            source: p.source,\n            pricing: p.pricing,\n            plans: p.plans,\n            description: p.description,\n            discussion: p.discussion,\n            deprecated: p.deprecated,\n            resources: p.resources,\n            reviews: p.reviews,\n            demos: p.demos,\n            wrapper: p.wrapper,\n        })\n    }\n}\n\nfn get_tag(t: &str, tags: &[Tag]) -> Result<Tag> {\n    for tag in tags {\n        if tag.value == t {\n            return Ok(tag.clone());\n        }\n    }\n    bail!(\"Invalid tag: {}\", t)\n}\n\nimpl PartialOrd for Entry {\n    fn partial_cmp(&self, other: &Entry) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for Entry {\n    fn cmp(&self, other: &Entry) -> Ordering {\n        self.name.to_lowercase().cmp(&other.name.to_lowercase())\n    }\n}\n\npub type EntryMap = BTreeMap<Tag, Vec<Entry>>;\n\n#[derive(Debug, Serialize, Deserialize, Template)]\n#[template(path = \"README.md\")]\npub struct Catalog {\n    pub linters: EntryMap,\n    pub others: EntryMap,\n    pub multi: Vec<Entry>,\n}\n\n/// An entry of the machine-readable JSON out from the tool.\n///\n/// We use a different, de-normalized data format instead of the catalog, which\n/// keeps the information for each tool in a struct instead of grouping tools by\n/// tags.\n#[derive(Debug, Serialize, Deserialize)]\npub struct ApiEntry {\n    /// The original entry name (not slugified)\n    pub name: String,\n    pub categories: BTreeSet<Category>,\n    pub languages: Vec<String>,\n    pub other: Vec<String>,\n    pub licenses: Vec<String>,\n    pub types: BTreeSet<ToolType>,\n    pub homepage: String,\n    pub source: Option<String>,\n    pub pricing: Option<String>,\n    pub plans: Option<BTreeMap<String, bool>>,\n    pub description: String,\n    pub discussion: Option<String>,\n    pub deprecated: Option<bool>,\n    pub resources: Option<Vec<Resource>>,\n    pub reviews: Option<BTreeSet<String>>,\n    pub demos: Option<BTreeSet<String>>,\n    pub wrapper: Option<bool>,\n}\n\n/// The final API dataformat is a map where the key is the entry name and the\n/// value is the entry data, which makes searching for a tool's data easier\npub type Api = BTreeMap<String, ApiEntry>;\n"
  },
  {
    "path": "data/render/templates/README.md",
    "content": "<!-- 🚨🚨 DON'T EDIT THIS FILE DIRECTLY. Edit `data/tools.yml` instead. 🚨🚨 -->\n\n<a href=\"https://analysis-tools.dev/\">\n  <img alt=\"Analysis Tools Website\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/redesign.svg\" />\n</a>\n\nThis repository lists **dynamic analysis tools** for all programming languages, build tools, config files and more. The focus is on tools which improve code quality such as linters and formatters.\nThe official website, [analysis-tools.dev](https://analysis-tools.dev/) is based on this repository and adds rankings, user comments, and additional resources like videos for each tool.\n\n[![Website](https://img.shields.io/badge/Website-Online-2B5BAE)](https://analysis-tools.dev)\n![CI](https://github.com/analysis-tools-dev/dynamic-analysis/workflows/CI/badge.svg)\n\n## Sponsors\n\nThis project would not be possible without the generous support of our sponsors.\n\n<table>\n   <tr>\n      <td>\n         <a href=\"https://bugprove.com\">\n            <picture >\n               <source width=\"200px\" media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/bugprove-dark.svg\">\n               <img width=\"200px\" alt=\"BugProve\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/bugprove-light.svg\">\n            </picture>\n         </a>\n      </td>\n      <td>\n         <a href=\"https://www.betterscan.io\">\n            <picture >\n               <source width=\"200px\" media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/betterscan-dark.svg\">\n               <img width=\"200px\" alt=\"Betterscan\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/betterscan-light.svg\">\n            </picture>\n         </a>\n      </td>\n      <td>\n         <a href=\"https://www.pixee.ai/\">\n            <picture >\n               <source width=\"200px\" media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/pixee-light.png\">\n               <img width=\"200px\" alt=\"Pixee\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/pixee-dark.png\">\n            </picture>\n         </a>\n      </td>\n      <td>\n         <a href=\"https://coderabbit.ai\">\n            <img width=\"200px\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/code-rabbit.svg\" />\n         </a>\n      </td>\n      <td>\n         <a href=\"https://semgrep.dev/\">\n            <img width=\"200px\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/semgrep.svg\" />\n         </a>\n      </td>\n      <td>\n         <a href=\"https://offensive360.com/\">\n            <img width=\"200px\" src=\"https://raw.githubusercontent.com/analysis-tools-dev/assets/master/static/sponsors/offensive360.png\" />\n         </a>\n      </td>\n   </tr>\n</table>\n\nIf you also want to support this project, head over to our [Github sponsors page](https://github.com/sponsors/analysis-tools-dev).\n\n## Meaning of Symbols:\n\n- :copyright: stands for proprietary software. All other tools are Open Source.\n- :information_source: indicates that the community does not recommend to use this tool for new projects anymore. The icon links to the discussion issue.\n- :warning: means that this tool was not updated for more than 1 year, or the repo was archived.\n\nPull requests are very welcome!  \nAlso check out the sister project, [awesome-static-analysis](https://github.com/mre/awesome-static-analysis).\n\n## Table of Contents\n\n#### [Programming Languages](#programming-languages-1)\n\n<details>\n <summary>Show languages</summary>\n  <!-- Please use HTML syntax here so that it works for Github and mkdocs -->\n  <ul>\n    {% for (language, _) in linters -%}\n      <li><a href=\"#{{ language.value }}\">{{ language.name }}</a></li>\n    {% endfor -%}\n  </ul>\n</details>\n\n#### [Multiple languages](#multiple-languages-1)\n\n#### [Other](#other-1)\n\n{% for (tag, _) in others %}\n\n- [{{ tag.name }}](#{{ tag.value }})\n  {% endfor %}\n\n---\n\n## Programming Languages\n\n{%- for (language, linters) in linters %}\n\n<h2 id=\"{{ language.value }}\">{{ language.name }}</h2>\n\n{% for linter in linters %}\n\n- [{{linter.name }}]({{linter.homepage }}){% if linter.discussion.is_some() %} [:information_source:](<{{linter.discussion.as_ref().unwrap()}}>){% endif %}{% if linter.deprecated.is_some() %} :warning:{% endif %}{% if linter.license == \"proprietary\" %} :copyright:{% endif %} — {{ linter.description }}\n  {% endfor %}\n\n{%- endfor %}\n\n## Multiple languages\n\n{% for linter in multi %}\n\n- [{{linter.name }}]({{linter.homepage }}){% if linter.discussion.is_some() %} [:information_source:](<{{linter.discussion.as_ref().unwrap()}}>){% endif %}{% if linter.deprecated.is_some() %} :warning:{% endif %}{% if linter.license == \"proprietary\" %} :copyright:{% endif %} — {{ linter.description }}\n  {% endfor %}\n\n## Other\n\n{% for (tag, others) in others %}\n\n<h2 id=\"{{ tag.value }}\">{{ tag.name }}</h2>\n\n{% for other in others %}\n\n- [{{ other.name }}]({{ other.homepage }}){% if other.discussion.is_some() %} [:information_source:](<{{other.discussion.as_ref().unwrap()}}>){% endif %}{% if other.deprecated.is_some() %} :warning:{% endif %}{% if other.license == \"proprietary\" %} :copyright:{% endif %} — {{ other.description }}\n  {% endfor %}\n\n{%- endfor %}\n\n## License\n\n[![CC0](https://i.creativecommons.org/p/zero/1.0/88x31.png)](https://creativecommons.org/publicdomain/zero/1.0/)\n\nTo the extent possible under law, [Matthias Endler](https://endler.dev) has waived all copyright and related or neighboring rights to this work.\nThe underlying source code used to format and display that content is licensed under the MIT license.\n\nTitle image [Designed by Freepik](http://www.freepik.com).\n"
  },
  {
    "path": "data/tags.yml",
    "content": "- name: .NET\n  value: dotnet\n  type: language\n- name: ABAP\n  value: abap\n  type: language\n- name: ActionScript\n  value: actionscript\n  type: language\n- name: Active Server Pages\n  value: asp\n  type: language\n- name: Ada\n  value: ada\n  type: language\n- name: Assembly\n  value: asm\n  type: language\n- name: ASP.NET\n  value: aspnet\n  type: language\n- name: Apex\n  value: apex\n  type: language\n- name: Awk\n  value: awk\n  type: language\n- name: C\n  value: c\n  type: language\n- name: Cloud\n  value: cloud\n  type: other\n- name: Clojure\n  value: clojure\n  type: language\n- name: COBOL\n  value: cobol\n  type: language\n- name: CoffeeScript\n  value: coffeescript\n  type: language\n- name: ColdFusion\n  value: coldfusion\n  type: language\n- name: C++\n  value: cpp\n  type: language\n- name: \"C#\"\n  value: csharp\n  type: language\n- name: Crystal\n  value: crystal\n  type: language\n- name: Dart\n  value: dart\n  type: language\n- name: Dlang\n  value: dlang\n  type: language\n- name: Delphi\n  value: delphi\n  type: language\n- name: Elixir\n  value: elixir\n  type: language\n- name: Elm\n  value: elm\n  type: language\n- name: Erlang\n  value: erlang\n  type: language\n- name: \"F#\"\n  value: fsharp\n  type: language\n- name: Fortran\n  value: fortran\n  type: language\n- name: Formatter\n  value: formatter\n  type: other\n- name: Go\n  value: go\n  type: language\n- name: Groovy\n  value: groovy\n  type: language\n- name: Haskell\n  value: haskell\n  type: language\n- name: Haxe\n  value: haxe\n  type: language\n- name: Java\n  value: java\n  type: language\n- name: JavaServer Pages\n  value: jsp\n  type: language\n- name: JavaScript\n  value: javascript\n  type: language\n- name: JSX\n  value: jsx\n  type: language\n- name: Julia\n  value: julia\n  type: language\n- name: Kotlin\n  value: kotlin\n  type: language\n- name: Lua\n  value: lua\n  type: language\n- name: MATLAB\n  value: matlab\n  type: language\n- name: Objective C\n  value: objectivec\n  type: language\n- name: Obj-C\n  value: objectivec\n  type: language\n- name: Perl\n  value: perl\n  type: language\n- name: PHP\n  value: php\n  type: language\n- name: PL/SQL\n  value: plsql\n  type: language\n- name: Python\n  value: python\n  type: language\n- name: R\n  value: r\n  type: language\n- name: RPG\n  value: rpg\n  type: language\n- name: Rails\n  value: rails\n  type: other\n- name: Ruby\n  value: ruby\n  type: language\n- name: Rust\n  value: rust\n  type: language\n- name: Scala\n  value: scala\n  type: language\n- name: Shell\n  value: shell\n  type: language\n- name: Smart Contracts\n  value: smart-contracts\n  type: other\n- name: SQL\n  value: sql\n  type: language\n- name: TSQL\n  value: tsql\n  type: language\n- name: Swift\n  value: swift\n  type: language\n- name: Tcl\n  value: tcl\n  type: language\n- name: TypeScript\n  value: typescript\n  type: language\n- name: VBScript\n  value: vbscript\n  type: language\n- name: Visual Basic for Applications (VBA)\n  value: vba\n  type: language\n- name: Visual Basic .NET\n  value: vbnet\n  type: language\n- name: Visual Basic\n  value: vbasic\n  type: language\n- name: API\n  value: api\n  type: other\n- name: Build tools\n  value: buildtool\n  type: other\n- name: Binaries\n  value: binary\n  type: other\n- name: Bytecode/IR\n  value: bytecode\n  type: other\n- name: More collections\n  value: collection\n  type: other\n- name: Containers\n  value: container\n  type: other\n- name: Config Files\n  value: configfile\n  type: other\n- name: Configuration Management\n  value: configmanagement\n  type: other\n- name: Continuous Integration\n  value: ci\n  type: other\n- name: CSS/SASS/SCSS\n  value: css\n  type: other\n- name: Deno\n  value: deno\n  type: other\n- name: Gherkin\n  value: gherkin\n  type: other\n- name: Haml\n  value: haml\n  type: other\n- name: HTML\n  value: html\n  type: other\n- name: IDE Plugins\n  value: ide\n  type: other\n- name: JSON\n  value: json\n  type: other\n- name: Laravel\n  value: laravel\n  type: other\n- name: LaTeX\n  value: latex\n  type: other\n- name: Less\n  value: less\n  type: other\n- name: Makefiles\n  value: make\n  type: other\n- name: Markdown\n  value: markdown\n  type: other\n- name: Metalinter\n  value: meta\n  type: other\n- name: Mobile\n  value: mobile\n  type: other\n- name: Node.js\n  value: nodejs\n  type: other\n- name: Packages\n  value: package\n  type: other\n- name: PhoneGap\n  value: phonegap\n  type: other\n- name: PowerShell\n  value: powershell\n  type: language\n- name: Protocol Buffers\n  value: protobuf\n  type: other\n- name: Security/DAST\n  value: security\n  type: other\n- name: Support\n  value: support\n  type: other\n- name: Template-Languages\n  value: template\n  type: other\n- name: Translation\n  value: translation\n  type: other\n- name: Visualforce\n  value: visualforce\n  type: language\n- name: Lightning Web Components\n  value: lwc\n  type: language\n- name: Vim Script\n  value: vim-script\n  type: language\n- name: Vue.js\n  value: vue\n  type: other\n- name: Vyper (Smart contract)\n  value: vyper\n  type: other\n- name: Writing\n  value: writing\n  type: other\n- name: Web\n  value: web\n  type: other\n- name: WebAssembly\n  value: webassembly\n  type: other\n- name: XML\n  value: xml\n  type: other\n- name: YAML\n  value: yaml\n  type: other\n- name: Zig\n  value: zig\n  type: language\n"
  },
  {
    "path": "data/tools/allocscope.yml",
    "content": "name: allocscope\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\n  - rust\nlicense: GPL-3.0\ntypes:\n  - cli\nsource: \"https://github.com/matt-kimball/allocscope\"\nhomepage: \"https://github.com/matt-kimball/allocscope\"\ndescription: >-\n  allocscope is a tool for tracking down where the most egregiously large\n  allocations are occurring in a C, C++ or Rust codebase. It is particularly\n  intendend to be useful for developers who want to get a handle on excessive\n  allocations and are working in a large codebase with multiple contributors\n  with allocations occuring in many modules or libraries.\n"
  },
  {
    "path": "data/tools/angr.yml",
    "content": "name: angr\ncategories:\n  - linter\ntags:\n  - binary\nlicense: BSD-2-Clause License\ntypes:\n  - cli\nsource: 'https://github.com/angr/angr'\nhomepage: 'https://github.com/angr/angr'\ndescription: Platform agnostic binary analysis framework from UCSB.\n"
  },
  {
    "path": "data/tools/appscan-standard.yml",
    "content": "name: AppScan Standard\ncategories:\n  - linter\ntags:\n  - security\nlicense: proprietary\ntypes:\n  - cli\nhomepage: 'https://www.hcltechsw.com/products/appscan'\ndescription: >-\n  HCL's AppScan is a dynamic application security testing suite (previously by IBM)\n"
  },
  {
    "path": "data/tools/bap.yaml",
    "content": "name: BAP\ncategories:\n  - linter\ntags:\n  - binary\nlicense: MIT\ntypes:\n  - cli\nsource: 'https://github.com/BinaryAnalysisPlatform/bap'\nhomepage: 'https://github.com/BinaryAnalysisPlatform/bap'\ndescription: The Carnegie Mellon University Binary Analysis Platform (CMU BAP) is a suite of utilities and libraries for the analysis of machine code. The included Primus microexecution interpreter enables dynamic analysis.\n"
  },
  {
    "path": "data/tools/bolt.yml",
    "content": "name: BOLT\ncategories:\n  - linter\ntags:\n  - binary\nlicense: LLVM Release License\ntypes:\n  - cli\nsource: 'https://github.com/facebookincubator/BOLT'\nhomepage: 'https://github.com/facebookincubator/BOLT'\ndescription:  >-\n  Binary Optimization and Layout Tool - A linux command-line utility used for optimizing performance of binaries \n  with profile guided permutation of linking to improve cache efficiency\n"
  },
  {
    "path": "data/tools/bytehound.yml",
    "content": "name: bytehound\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\n  - rust\nlicense: NOASSERTION\ntypes:\n  - cli\nsource: 'https://github.com/koute/bytehound'\nhomepage: 'https://github.com/koute/bytehound'\ndescription: >-\n    A memory profiler for Linux.\n    Can be used to analyze memory leaks, see where exactly the memory is being\n    consumed, identify temporary allocations and investigate excessive memory\n    fragmentation.\n"
  },
  {
    "path": "data/tools/cadvisor.yml",
    "content": "name: cadvisor\ncategories:\n  - linter\ntags:\n  - container\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/google/cadvisor'\nhomepage: 'https://github.com/google/cadvisor'\ndescription: Analyzes resource usage and performance characteristics of running containers.\n"
  },
  {
    "path": "data/tools/cargo-careful.yml",
    "content": "name: cargo-careful\ncategories:\n  - linter\ntags:\n  - rust\nlicense: Apache-2.0\ntypes:  \n  - cli\nsource: 'https://github.com/RalfJung/cargo-careful'\nhomepage: 'https://github.com/RalfJung/cargo-careful'\ndescription: >-\n    Execute Rust code carefully, with extra checking along the way.\n    It builds the standard library with debug assertions.\n    \n    Here are some of the checks this enables:\n\n    * `get_unchecked` in slices performs bounds checks\n    * `copy`, `copy_nonoverlapping`, and `write_bytes` check that pointers are aligned and non-null and (if applicable) non-overlapping\n    `{NonNull,NonZero*,...}::new_unchecked` check that the value is valid\n    * plenty of internal consistency checks in the collection types\n    * mem::zeroed and the deprecated mem::uninitialized panic if the type does not allow that kind of initialization\n"
  },
  {
    "path": "data/tools/casr.yml",
    "content": "name: CASR\ncategories:\n  - linter\ntags:\n  - security\n  - c\n  - cpp\n  - rust\n  - swift\n  - go\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/ispras/casr'\nhomepage: 'https://crates.io/crates/casr'\ndescription: Crash Analysis and Severity Report.\n"
  },
  {
    "path": "data/tools/chap.yml",
    "content": "name: CHAP\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\nlicense: GPL v2\ntypes:\n  - cli\nsource: 'https://github.com/vmware/chap'\nhomepage: 'https://github.com/vmware/chap'\ndescription: >-\n  Analyzes un-instrumented ELF core files for leaks, memory growth, and corruption.\n  It helps explain memory growth, can identify some forms of corruption, and \n  supplements a debugger by giving the status of various memory locations."
  },
  {
    "path": "data/tools/code-pulse.yml",
    "content": "name: Code Pulse\ncategories:\n  - linter\ntags:\n  - dotnet\n  - java\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/codedx/codepulse'\nhomepage: 'http://code-pulse.com/'\ndescription: >-\n  Code Pulse is a free real-time code coverage tool for penetration testing\n  activities by OWASP and Code Dx ([GitHub](https://github.com/codedx/codepulse)).\n"
  },
  {
    "path": "data/tools/crosshair.yml",
    "content": "name: CrossHair\ncategories:\n  - linter\ntags:\n  - python\nlicense: MIT License\ntypes:\n  - cli\nsource: 'https://github.com/pschanely/CrossHair'\nhomepage: 'https://github.com/pschanely/CrossHair'\ndescription: Symbolic execution engine for testing Python contracts.\n"
  },
  {
    "path": "data/tools/daikon.yml",
    "content": "name: Daikon\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\n  - java\nlicense: NOASSERTION\ntypes:\n  - cli\nsource: 'https://github.com/codespecs/daikon'\nhomepage: 'https://plse.cs.washington.edu/daikon/'\ndescription: >-\n  A dynamic detector of likely invariants. An invariant is a property \n  that holds at a certain program point, often seen in assert statements, \n  documentation, and formal specifications.\n"
  },
  {
    "path": "data/tools/dr.-memory.yml",
    "content": "name: Dr. Memory\ncategories:\n  - linter\ntags:\n  - binary\nlicense: LGPL License\ntypes:\n  - cli\nsource: 'https://github.com/DynamoRIO/drmemory'\nhomepage: 'https://drmemory.org/'\ndescription: >-\n  Dr. Memory is a memory monitoring tool capable of identifying memory-related\n  programming errors ([Github](https://github.com/DynamoRIO/drmemory)).\n"
  },
  {
    "path": "data/tools/dynamorio.yml",
    "content": "name: DynamoRIO\ncategories:\n  - linter\ntags:\n  - binary\nlicense: BSD License\ntypes:\n  - cli\nsource: 'https://github.com/DynamoRIO/dynamorio'\nhomepage: 'http://www.dynamorio.org/'\ndescription: >-\n  Is a runtime code manipulation system that supports code transformations\n  on any part of a program, while it executes.\n"
  },
  {
    "path": "data/tools/dynapyt.yml",
    "content": "name: DynaPyt\ncategories:\n  - linter\ntags:\n  - python\nlicense: MIT\ntypes:\n  - cli\nsource: 'https://github.com/sola-st/DynaPyt'\nhomepage: 'https://github.com/sola-st/DynaPyt'\ndescription: DynaPyt is a framework for writing dynamic analyses for Python. The analyses can also modify runtime values to alter the execution.\n"
  },
  {
    "path": "data/tools/enlightn.yml",
    "content": "name: Enlightn\r\ncategories:\r\n  - linter\r\ntags:\r\n  - php\r\n  - security\r\n  - laravel\r\nlicense: LGPL-3.0 License\r\ntypes:\r\n  - cli\r\nsource: 'https://github.com/enlightn/enlightn'\r\nhomepage: 'https://www.laravel-enlightn.com/'\r\ndescription: >-\r\n  A static and dynamic analysis tool for Laravel applications that provides\r\n  recommendations to improve the performance, security and code reliability\r\n  of Laravel apps. Contains 120 automated checks.\r\n"
  },
  {
    "path": "data/tools/hyperfine.yml",
    "content": "name: hyperfine\ncategories:\n  - linter\ntags:\n  - rust\nlicense: Apache-2.0\ntypes:\n  - cli\nsource: \"https://github.com/sharkdp/hyperfine\"\nhomepage: \"https://github.com/sharkdp/hyperfine\"\ndescription: >-\n  A command-line benchmarking tool\n  It features statistical analysis across multiple runs, support for arbitrary\n  shell commands, constant feedback about the benchmark progress and current\n  estimates, warmup runs, a simple and expressive syntax, and more.\n"
  },
  {
    "path": "data/tools/icontract.yml",
    "content": "name: icontract\ncategories:\n  - linter\ntags:\n  - python\nlicense: MIT\ntypes:\n  - cli\nsource: \"https://github.com/Parquery/icontract\"\nhomepage: \"https://github.com/Parquery/icontract\"\ndescription: >-\n  Design-by-contract library supporting behavioral subtyping\n\n  There is also a wider tooling around the icontract library such as \n  a linter (pyicontract-lint) and a plug-in for Sphinx (sphinx-icontract).\n"
  },
  {
    "path": "data/tools/iroh.js.yml",
    "content": "name: Iroh.js\ncategories:\n  - linter\ntags:\n  - javascript\nlicense: MIT License\ntypes:\n  - cli\nsource: 'https://github.com/maierfelix/Iroh'\nhomepage: 'https://github.com/maierfelix/Iroh'\ndescription: >-\n  A dynamic code analysis tool for JavaScript. Iroh allows to record your\n  code flow in realtime, intercept runtime informations and manipulate program behaviour\n  on the fly.\n"
  },
  {
    "path": "data/tools/jalangi2.yml",
    "content": "name: Jalangi2\ncategories:\n  - linter\ntags:\n  - javascript\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/Samsung/jalangi2'\nhomepage: 'https://github.com/Samsung/jalangi2'\ndescription: Jalangi2 is a popular framework for writing dynamic analyses for JavaScript.\n"
  },
  {
    "path": "data/tools/java-pathfinder.yml",
    "content": "name: Java PathFinder\ncategories:\n  - linter\ntags:\n  - java\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/javapathfinder/jpf-core'\nhomepage: 'https://github.com/javapathfinder/jpf-core'\ndescription: An extensible software model checking framework for Java bytecode programs.\n"
  },
  {
    "path": "data/tools/klee.yml",
    "content": "name: KLEE\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\nlicense: MIT License\ntypes:\n  - cli\nsource: 'https://github.com/klee/klee'\nhomepage: 'https://github.com/klee/klee'\ndescription: Symbolic virtual machine built on top of the LLVM compiler infrastructure.\n"
  },
  {
    "path": "data/tools/ldra.yml",
    "content": "name: LDRA\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\nlicense: proprietary\ntypes:\n  - cli\nhomepage: 'https://ldra.com'\ndescription: >-\n  A tool suite including dynamic analysis and test to various standards\n  can ensure test coverage to 100% op-code, branch & decsion coverage.\n"
  },
  {
    "path": "data/tools/llvm-clang-sanitizers.yml",
    "content": "name: LLVM/Clang Sanitizers\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/google/sanitizers'\nhomepage: 'https://github.com/google/sanitizers'\ndescription: >-\n    <ul>\n    <li><a href=\"https://github.com/google/sanitizers/wiki/AddressSanitizer\">AddressSanitizer</a> - A memory error detector for C/C++</li>\n    <li><a href=\"https://github.com/google/sanitizers/wiki/MemorySanitizer\">MemorySanitizer</a> - A detector of uninitialized memory reads in C/C++ programs.</li>\n    <li><a href=\"https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual\">ThreadSanitizer</a> - A data race detector for C/C++</li>\n    </ul>\n"
  },
  {
    "path": "data/tools/llvm-propeller.yml",
    "content": "name: llvm-propeller\ncategories:\n  - linter\ntags:\n  - binary\nlicense: Apache 2.0\ntypes:\n  - cli\nsource: 'https://github.com/google/llvm-propeller'\nhomepage: 'https://github.com/google/llvm-propeller'\ndescription: >-\n  Profile guided hot/cold function splitting to improve cache efficiency.\n  An alternative to BOLT by Facebook\n"
  },
  {
    "path": "data/tools/loom.yml",
    "content": "name: loom\ncategories:\n  - linter\ntags:\n  - rust\nlicense: MIT\ntypes:\n  - cli\nsource: 'https://github.com/tokio-rs/loom'\nhomepage: 'https://github.com/tokio-rs/loom'\ndescription: >-\n  Concurrency permutation testing tool for Rust. \n  It runs a test many times, permuting the possible concurrent executions of that test.\n"
  },
  {
    "path": "data/tools/microsoft-intellitest.yml",
    "content": "name: Microsoft IntelliTest\ncategories:\n  - linter\ntags:\n  - dotnet\nlicense: MIT License\ntypes:\n  - cli\nhomepage: 'https://docs.microsoft.com/en-us/visualstudio/test/intellitest-manual/getting-started?view=vs-2019'\ndescription: Generate a candidate suite of tests for your .NET code.\n"
  },
  {
    "path": "data/tools/miri.yml",
    "content": "name: MIRI\ncategories:\n  - linter\ntags:\n  - rust\nlicense: MIT License\ntypes:\n  - cli\nsource: 'https://github.com/rust-lang/miri'\nhomepage: 'https://github.com/rust-lang/miri'\ndescription: >-\n  An interpreter for Rust's mid-level intermediate representation, which\n  can detect certain classes of undefined behavior like out-of-bounds memory accesses\n  and use-after-free.\n"
  },
  {
    "path": "data/tools/parasoft-jtest.yml",
    "content": "name: Parasoft Jtest\ncategories:\n  - linter\ntags:\n  - java\nlicense: proprietary\ntypes:\n  - cli\nhomepage: 'https://www.parasoft.com/products/jtest'\ndescription: >-\n  Jtest is an automated Java software testing and static analysis product\n  that is made by Parasoft. The product includes technology for Data-flow analysis\n  Unit test-case generation and execution, static analysis, regression testing, code\n  coverage, and runtime error detection.\n"
  },
  {
    "path": "data/tools/pex-and-moles.yml",
    "content": "name: Pex and Moles\ncategories:\n  - linter\ntags:\n  - dotnet\nlicense: MIT License\ntypes:\n  - cli\nhomepage: 'https://www.microsoft.com/en-us/research/project/pex-and-moles-isolation-and-white-box-unit-testing-for-net/'\ndescription: >-\n  Pex automatically generates test suites with high code coverage using\n  automated white box analysis.\n"
  },
  {
    "path": "data/tools/pin-tools.yml",
    "content": "name: Pin Tools\ncategories:\n  - linter\ntags:\n  - binary\nlicense: MIT License\ntypes:\n  - cli\nhomepage: 'https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool'\ndescription: >-\n  A dynamic binary instrumentation tool and a platform for creating analysis\n  tools.\n"
  },
  {
    "path": "data/tools/poop.yml",
    "content": "name: poop\ncategories:\n  - linter\ntags:\n  - zig\nlicense: MIT\ntypes:\n  - cli\nsource: \"https://github.com/andrewrk/poop\"\nhomepage: \"https://github.com/andrewrk/poop\"\ndescription: >-\n  Performance Optimizer Observation Platform\n  This command line tool uses Linux's `perf_event_open` functionality to compare\n  the performance of multiple commands with a colorful terminal user interface.\n  It is similar to `hyperfine`.\n"
  },
  {
    "path": "data/tools/prowler.yml",
    "content": "name: prowler\ncategories:\n  - linter\ntags:\n  - cloud\nlicense: Apache-2.0 license\ntypes:\n  - cli\nsource: 'https://github.com/prowler-cloud/prowler'\nhomepage: 'https://prowler.pro'\nresources:\n  - title: 'Prowler Introduction'\n    url: 'https://www.youtube.com/watch?v=Oo5e45NCKFw'\ndescription: >-\n  Prowler is an Open Source security tool to perform AWS and Azure security best\n  practices assessments, audits, incident response, continuous monitoring,\n  hardening and forensics readiness.\n\n  It contains hundreds of controls covering CIS, PCI-DSS, ISO27001, GDPR, HIPAA,\n  FFIEC, SOC2, AWS FTR, ENS and custom security frameworks.\n"
  },
  {
    "path": "data/tools/puffin.yml",
    "content": "name: puffin\ncategories:\n  - linter\ntags:\n  - rust\nlicense: MIT License\ntypes:\n  - cli\nsource: 'https://github.com/EmbarkStudios/puffin'\nhomepage: 'https://github.com/EmbarkStudios/puffin'\ndescription: Instrumentation profiler for Rust.\n"
  },
  {
    "path": "data/tools/rust-san.yml",
    "content": "name: rust-san\ncategories:\n  - linter\ntags:\n  - rust\nlicense: Apache 2.0 / MIT License\ntypes:\n  - cli\nsource: 'https://github.com/japaric/rust-san'\nhomepage: 'https://github.com/japaric/rust-san'\ndescription:  How-to sanitize your Rust code with built-in Rust dynamic analyzers\n"
  },
  {
    "path": "data/tools/scalene.yml",
    "content": "name: Scalene\ncategories:\n  - profiler\ntags:\n  - python\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/emeryberger/scalene'\nhomepage: 'https://github.com/emeryberger/scalene'\ndescription: A high-performance, high-precision CPU and memory profiler for Python \n"
  },
  {
    "path": "data/tools/smartbear.yml",
    "content": "name: Smartbear\ncategories:\n  - linter\ntags:\n  - api\n  - web\nlicense: proprietary\ntypes:\n  - service\nhomepage: 'https://smartbear.com/'\ndescription: 'Test automation and performance testing platform'\n"
  },
  {
    "path": "data/tools/souper.yml",
    "content": "name: souper\ncategories:\n  - linter\ntags:\n  - bytecode\nlicense: Apache 2.0\ntypes:\n  - cli\nsource: 'https://github.com/google/souper'\nhomepage: 'https://github.com/google/souper'\ndescription: optimize LLVM IR with SMT solvers\n"
  },
  {
    "path": "data/tools/statsviz.yml",
    "content": "name: statsviz\ncategories:\n  - linter\ntags:\n  - go\nlicense: MIT\ntypes:\n  - cli\nsource: 'https://github.com/arl/statsviz'\nhomepage: 'https://github.com/arl/statsviz'\ndescription: >- \n  Instant live visualization of your Go application runtime statistics in the browser.\n  It plots heap usage, MSpans/MCaches, Object counts, Goroutines and GC/CPU fraction.\n"
  },
  {
    "path": "data/tools/stuck.yml",
    "content": "name: stuck\ncategories:\n  - linter\ntags:\n  - rust\nlicense: MIT License\ntypes:\n  - cli\nsource: 'https://github.com/jonhoo/stuck'\nhomepage: 'https://github.com/jonhoo/stuck'\ndescription: >-\n  provides a visualization for quickly identifying common bottlenecks in\n  running, asynchronous, and concurrent applications.\n"
  },
  {
    "path": "data/tools/suture.yml",
    "content": "name: suture\ncategories:\n  - linter\ntags:\n  - ruby\nlicense: MIT\ntypes:\n  - cli\nsource: 'https://github.com/testdouble/suture'\nhomepage: 'https://github.com/testdouble/suture'\ndescription: >-\n  A Ruby gem that helps you refactor your legacy code \n  by the result of some old behavior with a new version.\n"
  },
  {
    "path": "data/tools/sydr.yml",
    "content": "name: Sydr\ncategories:\n  - fuzzer\n  - linter\ntags:\n  - security\n  - c\n  - cpp\n  - rust\n  - swift\n  - go\nlicense: proprietary\ntypes:\n  - cli\nhomepage: 'https://sydr-fuzz.github.io/'\nresources:\n  - title: Sydr - Cutting Dynamic Symbolic Execution\n    url: https://www.ispras.ru/conf/2020/video/compiler-technology-11-december.mp4#t=6021\ndescription: Continuous Hybrid Fuzzing and Dynamic Analysis for Security Development Lifecycle.\n"
  },
  {
    "path": "data/tools/triton.yml",
    "content": "name: TRITON\ncategories:\n  - linter\ntags:\n  - binary\nlicense: Apache-2.0 License\ntypes:\n  - cli\nsource: 'https://github.com/JonathanSalwan/Triton'\nhomepage: 'https://triton.quarkslab.com/'\ndescription: Dynamic Binary Analysis for x86 binaries.\n"
  },
  {
    "path": "data/tools/typo.yml",
    "content": "name: typo\ncategories:\n  - linter\ntags:\n  - python\nlicense: MIT License\ntypes:\n  - cli\nsource: 'https://github.com/aldanor/typo'\nhomepage: 'https://github.com/aldanor/typo'\ndescription: Runtime Type Checking for Python 3.\n"
  },
  {
    "path": "data/tools/valgrind.yml",
    "content": "name: Valgrind\ncategories:\n  - linter\ntags:\n  - c\n  - cpp\nlicense: GNU General Public License v2\ntypes:\n  - cli\nsource: 'https://sourceware.org/git/?p=valgrind.git'\nhomepage: 'https://valgrind.org/'\ndescription: An instrumentation framework for building dynamic analysis tools.\n"
  },
  {
    "path": "data/tools/vb-watch.yml",
    "content": "name: VB Watch\ncategories:\n  - linter\ntags:\n  - vbasic\nlicense: proprietary\ntypes:\n  - cli\nhomepage: 'https://www.aivosto.com/vbwatch.html'\ndescription: >-\n  Profiler, Protector and Debugger for VB6. Profiler measures performance\n  and test coverage. Protector implements robust error handling. Debugger helps monitor\n  your executables.\n"
  },
  {
    "path": "data/tools/wasabi.yml",
    "content": "name: Wasabi\ncategories:\n  - linter\ntags:\n  - webassembly\nlicense: MIT\ntypes:\n  - cli\nsource: 'https://github.com/danleh/wasabi'\nhomepage: 'https://github.com/danleh/wasabi'\ndescription: Wasabi is a framework for writing dynamic analyses for WebAssembly, written in JavaScript.\n"
  },
  {
    "path": "data/tools/whitehat-sentinel-dynamic.yml",
    "content": "name: WhiteHat Sentinel Dynamic\ncategories:\n  - linter\ntags:\n  - security\n  - sql\n  - xml\nlicense: proprietary\ntypes:\n  - cli\nhomepage: 'https://www.synopsys.com/software-integrity/security-testing/dast.html'\ndescription: >-\n  Part of the WhiteHat Application Security Platform. Dynamic application\n  security scanner that covers the OWASP Top 10.\n"
  }
]