obfuskator/docs/README.md
loki5512344 a641e69455 Initial commit: noxis JVM bytecode obfuscator
Workspace of 9 crates (noxis, noxis-core, noxis-classfile, noxis-analysis,
noxis-passes, noxis-runtime, noxis-jar, noxis-verify, noxis-structure-check).
AGPL-3.0-only license, Rust 2024 edition, unsafe_code denied.
2026-10-08 22:01:03 +02:00

68 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Документация noxis
Обфускатор JVM/Java-байткода на Rust. Этот файл — индекс.
## Что где
| файл | что внутри |
|---|---|
| [`architecture.md`](architecture.md) | слои, крейты, собственный IR, конвейер пассов, структурные правила |
| [`techniques.md`](techniques.md) | как работает каждая техника + плюсы/минусы/цена |
| [`stack.md`](stack.md) | почему свой IR, какой backend, `StackMapTable`, PRNG, генерация рантайма |
| [`learnings/lessons.md`](learnings/lessons.md) | уроки из разбора EvoVis: что защита сделала плохо и чего мы не делаем |
| [`learnings/reference.md`](learnings/reference.md) | разбор референсного обфускатора (Java/ASM) — что берём, что нет |
| [`learnings/priorities.md`](learnings/priorities.md) | что улучшим: стратегия и приоритеты |
План выполнения — [`../todo.md`](../todo.md). Исходный материал разбора —
[`../info/`](../info/README.md).
## Структурные правила проекта
Правила действуют на **весь наш код и документацию**: `crates/**` и `docs/**`.
Не учитываются: `Cargo.lock`, `.gitignore`, `info/`, корень крейта
(в нём всегда лежат `Cargo.toml` + `build.rs`).
1. **Не больше 250 строк** в одном `.rs` или `.md` файле.
2. **Не больше 4 файлов** в одной директории. Подпапки не ограничены:
`src/` может содержать `lib.rs` и три модуля-директории, каждая из которых
в свою очередь содержит не больше четырёх файлов.
Проверяются: `crates/*/src`, `crates/*/tests`, `crates/*/benches` и `docs/`.
`tests/` и `benches/` не исключены намеренно — иначе правило
«250 строк» обходится выносом кода в тесты.
Правило 2 — это не косметика: файл из тысячи строк означает, что в нём
смешаны разные причины к изменению (нарушение KISS/DRY/SOLID), а команда из
восьми файлов в одной папке — что модуль перестал быть модулем.
### Как проверяется
Правила гоняются **при компиляции**. Каждый крейт имеет `build.rs`:
```rust
fn main() {
noxis_structure_check::check();
}
```
`noxis-structure-check` находит корень воркспейста, обходит деревья `src/`,
`tests/` и `benches/` всех крейтов плюс `docs/`, и **падает со стопкой ошибок**,
если лимит нарушен. Поэтому `cargo build` не соберёт нарушение — специально
запускать проверку не нужно. Деревья регистрируются через
`cargo:rerun-if-changed`, так что правка `docs/` тоже перезапускает гейт.
Остальное, что не привязано к компиляции, собирается одним скриптом:
```sh
./scripts/check.sh # structure → fmt → clippy -D warnings → test
```
### Что делать при нарушении
- файл разрослся → разрезать по одной ответственности на файл:
`mod.rs` = публичный контракт модуля, соседние файлы — внутренности;
- папка переполнилась → завести подпапку и вынести подфункцию целиком,
а не «чтобы влезло».
Каждый модуль получает `mod.rs` с `//!`-документацией — это точка входа,
читающаяся вместо пяти файлов.