obfuskator/docs/README.md
loki5512344 39178420e4
structure-check: gate counts code lines, docs and comments in English
Gate ignores blank and full-line comment lines so the 250-line limit
measures code bulk, not documentation weight; docs/README.md synced.
Translate code comments to English in classfile, core config, namegen,
rename assign, constants forms. Expand Plausible word bank with
client-ecosystem terms (Module, Setting, Mixin, ...). cargo fmt clean,
check.sh green.
2026-10-09 10:31:02 +02:00

72 lines
4.6 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) | что улучшим: стратегия и приоритеты |
| [`learnings/ai-resistance.md`](learnings/ai-resistance.md) | новые техники обфускации и устойчивость к LLM-анализу |
План выполнения — [`../todo.md`](../todo.md). Исходный материал разбора —
[`../info/`](../info/README.md).
## Структурные правила проекта
Правила — **только про Rust-код**: `crates/*/src`, `crates/*/tests`,
`crates/*/benches`. Документация (`docs/**`, корневые `.md`) и `info/` вне
гейта: писать подробно там, где это документация, а не ограничивать объём
искусственно. Не учитываются также `Cargo.lock`, `.gitignore`, корень крейта
(в нём всегда лежат `Cargo.toml` + `build.rs`).
1. **Не больше 250 строк кода** в одном `.rs` файле. Пустые строки и
полно-строчные комментарии (`//`, `///`, `//!`) не считаются —
измеряется объём кода, а не документации.
2. **Не больше 4 `.rs`-файлов** в одной директории. Подпапки не ограничены:
`src/` может содержать `lib.rs` и три модуля-директории, каждая из которых
в свою очередь содержит не больше четырёх файлов.
`tests/` и `benches/` не исключены намеренно — иначе правило
«250 строк» обходится выносом кода в тесты.
Правило 2 — это не косметика: файл из тысячи строк означает, что в нём
смешаны разные причины к изменению (нарушение KISS/DRY/SOLID), а команда из
восьми файлов в одной папке — что модуль перестал быть модулем.
### Как проверяется
Правила гоняются **при компиляции**. Каждый крейт имеет `build.rs`:
```rust
fn main() {
noxis_structure_check::check();
}
```
`noxis-structure-check` обходит деревья `src/`, `tests/` и `benches/` **этого
крейта** и **падает со стопкой ошибок**, если лимит нарушен. Поэтому
`cargo build` не соберёт нарушение — специально запускать проверку не нужно.
Деревья регистрируются через `cargo:rerun-if-changed`, чтобы гейт не
срабатывал на правки вне проверяемых путей.
Остальное, что не привязано к компиляции, собирается одним скриптом:
```sh
./scripts/check.sh # structure → fmt → clippy -D warnings → test
```
### Что делать при нарушении
- файл разрослся → разрезать по одной ответственности на файл:
`mod.rs` = публичный контракт модуля, соседние файлы — внутренности;
- папка переполнилась → завести подпапку и вынести подфункцию целиком,
а не «чтобы влезло».
Каждый модуль получает `mod.rs` с `//!`-документацией — это точка входа,
читающаяся вместо пяти файлов.