{"id":43940840,"url":"https://github.com/soteria-tools/soteria","last_synced_at":"2026-05-20T08:00:58.170Z","repository":{"id":259037077,"uuid":"851053978","full_name":"soteria-tools/soteria","owner":"soteria-tools","description":"Sound static analysis for the masses.","archived":false,"fork":false,"pushed_at":"2026-05-17T05:49:01.000Z","size":169155,"stargazers_count":59,"open_issues_count":52,"forks_count":9,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-05-17T07:43:39.959Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://soteria-tools.com","language":"OCaml","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/soteria-tools.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSES/Apache-2.0.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":"CLA.md"}},"created_at":"2024-09-02T10:41:46.000Z","updated_at":"2026-05-16T11:30:12.000Z","dependencies_parsed_at":"2024-10-25T01:59:08.392Z","dependency_job_id":"308959db-a1a5-46b9-a2f7-2a0b715c1677","html_url":"https://github.com/soteria-tools/soteria","commit_stats":null,"previous_names":["bugs-for-all/bfa-ocaml","soteria-tools/soteria"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/soteria-tools/soteria","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soteria-tools%2Fsoteria","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soteria-tools%2Fsoteria/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soteria-tools%2Fsoteria/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soteria-tools%2Fsoteria/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soteria-tools","download_url":"https://codeload.github.com/soteria-tools/soteria/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soteria-tools%2Fsoteria/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33251237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T04:48:54.280Z","status":"ssl_error","status_checked_at":"2026-05-20T04:48:10.851Z","response_time":356,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-07T02:00:19.929Z","updated_at":"2026-05-20T08:00:58.093Z","avatar_url":"https://github.com/soteria-tools.png","language":"OCaml","funding_links":[],"categories":["Verifiers"],"sub_categories":[],"readme":"\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"./assets/LOGO-SOTERIA-FULL-WHITE.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"./assets/LOGO-SOTERIA-FULL-COLOUR.png\"\u003e\n  \u003cimg alt=\"Shows a black logo in light color mode and a white one in dark color mode.\" src=\"./assets/LOGO-SOTERIA-FULL-COLOUR.png\"\u003e\n\u003c/picture\u003e\n\nSoteria is a library for writing efficient symbolic interpreters directly in OCaml.\nThe core library is just a small toolbox that we use for writing a set of analyses, currently for Rust and C.\n\n\n[![Zulip Chat](https://img.shields.io/badge/join-zulip?logo=zulip\u0026label=Zulip\u0026labelColor=%2330363D\u0026color=%232FBC4F)](https://soteria.zulipchat.com/)\n[![CI](https://github.com/soteria-tools/soteria/actions/workflows/ci.yml/badge.svg)](https://github.com/soteria-tools/soteria/actions/workflows/ci.yml)\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg?labelColor=%2330363D)](https://opensource.org/licenses/Apache-2.0)\n\n**[Website](https://soteria-tools.com)** | **[API Documentation](https://soteria-tools.github.io/soteria/api/main/soteria/index.html)**\n\n## Table of Contents\n\n- [Getting Started](#getting-started)\n  - [Prerequisites](#prerequisites)\n  - [Installing from Source](#installing-from-source)\n  - [Building from Source for Development](#building-from-source-for-development)\n  - [Installing Rust Frontends](#installing-rust-frontends)\n- [Using Soteria as a Library](#using-soteria-as-a-library)\n- [Soteria Rust](#soteria-rust)\n- [Soteria-C](#soteria-c)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Getting Started\n\n### Prerequisites\n\nBefore using Soteria, ensure you have the following installed:\n\n| Dependency | Version | Installation |\n|------------|---------|--------------|\n| OCaml | \u003e= 5.4.0 | [ocaml.org/docs/installing-ocaml](https://ocaml.org/docs/installing-ocaml) |\n| opam | \u003e= 2.0 | Included with OCaml installation |\n| Z3 | latest | [github.com/Z3Prover/z3](https://github.com/Z3Prover/z3) |\n\nFor **Soteria Rust**, you will also need:\n\n| Dependency | Version | Installation |\n|------------|---------|--------------|\n| Rust | nightly | [rustup.rs](https://rustup.rs/) |\n| Obol | see below | [Installing Obol](#installing-obol) |\n| Charon | see below | [Installing Charon](#installing-charon) |\n\n\u003e **Note:** Both frontends are required to run the full test suite.\n\n### Installing from Source\n\n\u003cdetails\u003e\n\u003csummary\u003eFor users who want to install and use Soteria\u003c/summary\u003e\n\n1. **Clone the repository:**\n   ```sh\n   git clone https://github.com/soteria-tools/soteria.git\n   cd soteria\n   ```\n\n2. **Create a global opam switch and install:**\n   ```sh\n   make glob-switch \u0026\u0026 make install\n   ```\n   This creates a global opam switch called `soteria-install`, switches to it, and installs Soteria.\n\n3. **Activate the switch:**\n   ```sh\n   eval $(opam env --switch=soteria-install)\n   ```\n   Add this line to your shell profile (`.bashrc`, `.zshrc`, etc.) to make it permanent, or run `opam switch soteria-install` to switch to it in your current shell.\n\u003c/details\u003e\n\n### Building from Source for Development\n\n\u003cdetails\u003e\n\u003csummary\u003eFor developers who want to contribute to Soteria\u003c/summary\u003e\n\n1. **Clone the repository:**\n   ```sh\n   git clone https://github.com/soteria-tools/soteria.git\n   cd soteria\n   ```\n\n2. **Create a local opam switch and install dependencies:**\n   ```sh\n   make switch\n   ```\n   This creates an isolated OCaml environment with all required dependencies.\n\n   Alternatively, if you already have a switch you want to use:\n   ```sh\n   make ocaml-deps\n   ```\n\n3. **Build the project:**\n   ```sh\n   dune build\n   ```\n\n4. **Verify the installation by running the test suite:**\n   ```sh\n   dune test\n   ```\n\n   \u003e **Note:** Running `dune test` requires both Rust frontends (Obol and Charon) to be installed. To run only the core Soteria or Soteria-C tests without Rust frontends:\n   \u003e ```sh\n   \u003e dune test soteria      # Core library tests only\n   \u003e dune test soteria-c    # Soteria-C tests only\n   \u003e ```\n\u003c/details\u003e\n\n### Installing Rust Frontends\n\n\u003cdetails\u003e\n\u003csummary\u003eTo use Soteria Rust, you need to install the supported frontends\u003c/summary\u003e\nTo use Soteria Rust, you need a frontend to translate Rust code to an intermediate representation. \n\nWe support two frontends: [Obol](https://github.com/soteria-tools/obol) and [Charon](https://github.com/AeneasVerif/charon).\n\n\u003e **Quick Setup:** Use the versionsync script to automatically install both frontends:\n\u003e ```sh\n\u003e ./scripts/versionsync.py pull all --init\n\u003e ```\n\u003e This will clone and build both Obol and Charon at the correct commits.\n\n#### Installing Obol\n\n[Obol](https://github.com/soteria-tools/obol) is the default frontend (recommended for most use cases).\n\n**Using the versionsync script (recommended):**\n```sh\n./scripts/versionsync.py pull obol --init\n```\n\n**Manual installation:**\n1. **Clone Obol at the correct commit:**\n   \u003c!-- [versionsync: OBOL_COMMIT_HASH=70610866c606acc9b4c3a460ac586d81459d1304] --\u003e\n   ```sh\n   cd ..\n   git clone https://github.com/soteria-tools/obol.git\n   cd obol\n   git checkout 70610866c606acc9b4c3a460ac586d81459d1304\n   ```\n   \u003e **Note:** The required commit hash can always be found in [`scripts/versions.json`](scripts/versions.json) under `OBOL_COMMIT_HASH`.\n\n2. **Build Obol:**\n   ```sh\n   make build\n   ```\n\n3. **Add Obol to your PATH:**\n   ```sh\n   export PATH=\"$PATH:$(pwd)/bin\"\n   ```\n   Add this line to your shell profile (`.bashrc`, `.zshrc`, etc.) to make it permanent.\n\n#### Installing Charon\n\n[Charon](https://github.com/AeneasVerif/charon) is an alternative frontend. To use it, pass `--frontend charon` to `soteria-rust`.\n\n**Using the versionsync script (recommended):**\n```sh\n./scripts/versionsync.py pull charon --init\n```\n\n**Manual installation:**\n1. **Clone Charon at the correct commit:**\n   \u003c!-- [versionsync: CHARON_COMMIT_HASH=1ec8d4bb0116abf4486bac234ac01acf84e2a83a] --\u003e\n   ```sh\n   cd ..\n   git clone https://github.com/soteria-tools/charon.git\n   cd charon\n   git checkout 1ec8d4bb0116abf4486bac234ac01acf84e2a83a\n   ```\n   \u003e **Note:** The required commit hash can always be found in [`scripts/versions.json`](scripts/versions.json) under `CHARON_COMMIT_HASH`.\n\n2. **Build Charon:**\n   ```sh\n   make build-charon-rust\n   ```\n\n3. **Add Charon to your PATH:**\n   ```sh\n   export PATH=\"$PATH:$(pwd)/bin\"\n   ```\n   Add this line to your shell profile (`.bashrc`, `.zshrc`, etc.) to make it permanent.\n\u003c/details\u003e\n\n## Using Soteria as a Library\n\nSoteria can be used as a library to build your own symbolic execution engines. The [API documentation](https://soteria-tools.github.io/soteria/api/main/soteria/index.html) provides a complete reference, and includes a tutorial on how to get started building your own analysis tools.\n\n## Soteria Rust\n\nSoteria Rust is a Kani-like symbolic execution engine for Rust. It is in heavy development.\n\n### Usage\n\nRun on a standalone Rust file, symbolically executing the `main` function:\n```sh\nsoteria-rust exec \u003cfile.rs\u003e\n```\n\nRun in Kani mode to execute any function with the `#[kani::proof]` attribute:\n```sh\nsoteria-rust exec --kani \u003cfile.rs\u003e\n```\n\nRun all tests in a crate:\n```sh\nsoteria-rust exec \u003ccrate-dir\u003e\n```\n\nUse `--help` with any command for a full list of options:\n```sh\nsoteria-rust exec --help\n```\n\n### Testing Against External Suites\n\nTo test Soteria Rust against external test suites:\n\n```sh\n# Test against the Kani test suite\ngit clone https://github.com/model-checking/kani.git ../kani\nsoteria-rust/scripts/test.py kani\n\n# Test against the Miri test suite\ngit clone https://github.com/rust-lang/miri.git ../miri\nsoteria-rust/scripts/test.py miri\n```\n\n### Limitations\n\nSoteria Rust supports a large subset of Rust, but some features are not yet supported:\n- Concurrency\n- Inline assembly\n- SIMD intrinsics\n\n## Soteria-C\n\nSoteria-C is an automatic bug finder for C programs. It is in heavy development.\n\n### Usage\n\nRun on a standalone C file:\n```sh\nsoteria-c exec-main \u003cfile.c\u003e\n```\n\nRun with a compilation database:\n```sh\nsoteria-c capture-db compile_commands.json\n```\n\nUse `--help` for a full list of options:\n```sh\nsoteria-c --help\n```\n\n## Contributing\n\nWe welcome contributions from the community! Soteria is open source and will remain open source.\n\nSoteria is developed and maintained by [Soteria Tools Ltd](https://soteria-tools.com). The core team makes final decisions on project direction, but we value community input and aim to be transparent about our decision-making process.\n\n- **Chat with us:** Join our [Zulip chat](https://soteria.zulipchat.com/) to ask questions or discuss ideas\n- **Submit a PR:** Read our [contribution guidelines](./CONTRIBUTING.md) first\n- **License agreement:** Review the [Contributor License Agreement](./CLA.md) before contributing\n\n## License\n\nSoteria and derived tools in this repository are under Apache-2.0 license, copyright Soteria Tools Ltd 2026.\n\nThe Soteria logo is a trademark of the Soteria Tools Ltd.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoteria-tools%2Fsoteria","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoteria-tools%2Fsoteria","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoteria-tools%2Fsoteria/lists"}