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