aboutsummaryrefslogtreecommitdiffstats
path: root/GEMINI.md
blob: 97dd5df7ae964b072e6c723dbaa479792c57e6b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# syzkaller - Context for Gemini

## Project Overview
`syzkaller` is an unsupervised, coverage-guided kernel fuzzer. It is a hybrid
system consisting of a **Go-based manager** (running on a host) and a **C++
executor** (running inside the target VM).

-   **Primary Language:** Go (Manager, Tools), C++ (Executor).
-   **Architecture:**
    -   `syz-manager`: Orchestrates the fuzzing process, manages corpus, and monitors VMs.
    -   `syz-executor`: Runs inside the VM, executes test programs via syscalls, and collects coverage.
    -   `syz-ci`, `syz-hub`, `dashboard`: Infrastructure for continuous fuzzing and reporting.

## Building and Testing

Prefer to use the `syz-env` Docker container to build the compontents and run
tests. There's a `./tools/syz-env` script that will start a container and run
the given command inside it.

Some reference commands:
* Build everything: `CI=true ./tools/syz-env make`.
* Run a linter: `CI=true ./tools/syz-env make lint`.
* Run a test: `CI=true ./tools/syz-env go test ./package -run TestName`.
* Formatter: `CI=true ./tools/syz-env make format` (runs `gofmt`, `clang-format`, etc).

Note the `CI=true` part - otherwise the commands may not run in your environment.

When running tests (especially in `./prog` and `./pkg/csource`) prefer to run
individual tests you have affected, otherwise it may take a lot of time. Some
packages also offer a `-short` flag to run a lighter version of tests.

It may be necessary to first run `CI=true ./tools/syz-env make descriptions` to
pre-build descriptions for the `sys/*` targets. It may be necessary for all
tests that eventually use `prog.Target` or `targets.Target`.

## Key Directories

-   `syz-manager/`: Entry point for the main fuzzing manager.
-   `executor/`: C++ source code for the test program executor.
-   `pkg/`: Core Go libraries:
    -   `pkg/ipc`: IPC mechanism between manager and executor.
    -   `pkg/fuzzer`: Fuzzing logic.
    -   `pkg/manager`: Manager logic library.
-   `sys/`: System call descriptions (essential for the fuzzer to know how to call the kernel).
    -   `sys/linux/`: Linux-specific descriptions (`.txt` and `.const`).
-   `tools/`: Helper utilities (`syz-repro`, `syz-mutate`, etc.).
-   `docs/`: Extensive documentation on setup, internals, and contribution.

## Development Conventions

-   **Commit Messages:** Strict formatting required.
    -   Format: `dir/path: description` (e.g., `pkg/fuzzer: fix crash in minimization`).
    -   No trailing dot in the summary.
-   **Testing:** New features must have tests.
-   **Formatting:** Always run `make format` before committing.
-   **Syscall Descriptions:** When modifying `sys/*/*.txt`, `make generate` must be run to update generated code.
-   **Copyright:** When you add new .go files, make sure to add the copyright header to them (use other .go files for reference and update the year to the current one).

## Other GEMINI.md files

There exist other GEMINI.md files:
- `sys/GEMINI.md` - consider it when you are asked to write/modify syzlang descriptions.
- `syz-cluster/GEMINI.md` - consider it when working on the syz-cluster (patch fuzzing) functionality.
- `pkg/aflow/GEMINI.md` - consider it when working on the aflow (agentic flow) functionality.