From b335467252c643d32e42350c9c4a0d86b19bdce1 Mon Sep 17 00:00:00 2001 From: "David E. Weekly" Date: Fri, 18 Sep 2026 20:44:45 -0700 Subject: [PATCH] release: prepare 0.3.1 Patch release carrying the origin-analysis loop widening fix (PR #85) and the README badges and coverage workflow. Bumps the workspace version, both lockfiles, the README status lines, and closes the changelog section. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01FtirLUpUr9aWq57opQ3WVi --- CHANGELOG.md | 7 ++++++- Cargo.lock | 18 +++++++++--------- Cargo.toml | 2 +- README.md | 12 ++++++------ fuzz/Cargo.lock | 14 +++++++------- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c5cb71..f8573ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,13 @@ All notable changes are documented here. `luad` is a 0.x experimental tool: no dialect is promoted to a supported tier and no interface carries a compatibility promise yet. -## Unreleased +## 0.3.1 — 2026-09-18 +- Fix Lua 5.1 origin analysis exhausting its transfer-step budget on functions that + contain loops. Loop-carried slots whose value kept growing on every pass now widen to + `control-flow-conflict` after a bounded number of block revisits, so every call outside + the loop keeps its exact origin instead of the whole prototype reporting + `analysis-limit` (144 to 17 `analysis-limit` results across a 260-file firmware corpus). - Add the project logo and CI, Codecov, release, and dual-license badges to the README. Publish measured Linux line coverage from the workspace suite and instrumented CLI subprocesses through a separate coverage workflow. diff --git a/Cargo.lock b/Cargo.lock index 57ae044..e414e67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -604,7 +604,7 @@ dependencies = [ [[package]] name = "luad-analysis" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -621,7 +621,7 @@ dependencies = [ [[package]] name = "luad-cli" -version = "0.3.0" +version = "0.3.1" dependencies = [ "clap", "clap_complete", @@ -642,7 +642,7 @@ dependencies = [ [[package]] name = "luad-core" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "schemars", @@ -654,7 +654,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua51" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -666,7 +666,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua52" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -678,7 +678,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua53" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -690,7 +690,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua54" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -702,7 +702,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua55" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -714,7 +714,7 @@ dependencies = [ [[package]] name = "luad-oracle" -version = "0.3.0" +version = "0.3.1" dependencies = [ "clap", "hex", diff --git a/Cargo.toml b/Cargo.toml index 8217150..29dcf9d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.3.0" +version = "0.3.1" edition = "2021" rust-version = "1.85" authors = ["luad contributors"] diff --git a/README.md b/README.md index a94f4df..9a12d4a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ non-standard ones that turn up inside extracted router and embedded firmware. It does not decompile. When you want source back, `luad` tells you exactly which profile the chunk uses so you can hand it to a decompiler that reads that profile. -## Status: 0.3.0, experimental +## Status: 0.3.1, experimental This is an early release of a tool built for fun. It works, and it gives real answers on real firmware, but no dialect is promoted to a supported tier and nothing here is @@ -172,7 +172,7 @@ required to build or test luad; the walkthrough verifies luad facts and refusal ## Limitations -Current scope in 0.3.0: +Current scope in 0.3.1: | Dialect | Opcodes | Tier | State | |---|---:|---|---| @@ -192,8 +192,8 @@ answers, not that its correctness has been qualified. Lua 5.2, 5.3, and 5.5 are limited to structural facts and validation. Derived analysis commands refuse these dialects rather than presenting unqualified semantic results. Layout, operand, analysis-eligibility, and malformed-input regressions cover the fixes -in 0.3.0; they do not establish complete semantic correctness or support for every -vendor layout. See [the changelog](CHANGELOG.md#030--2026-09-18) for release details. +in 0.3.1; they do not establish complete semantic correctness or support for every +vendor layout. See [the changelog](CHANGELOG.md#031--2026-09-18) for release details. `luad` also does not do firmware extraction, decompilation, source reconstruction, exploitability judgment, or persistent research state. Those belong in other tools, and @@ -215,7 +215,7 @@ luad schema chunk Consumers should read [docs/MACHINE-INTERFACE.md](docs/MACHINE-INTERFACE.md) for exit codes, stable-ID scope, truncation behavior, and the stdout/stderr contract. Schemas are -versioned, but at 0.3.0 nothing carries a compatibility promise yet. +versioned, but at 0.3.1 nothing carries a compatibility promise yet. [docs/examples/RECIPES.md](docs/examples/RECIPES.md) has practical composition recipes. @@ -226,7 +226,7 @@ runnable Lua bytecode tool against chunks that stock desktop Lua never produces, starting with EdgeTX radio firmware (32-bit Lua 5.3, 4-byte floats, a header slot that does not describe the body). The honest summary as of 2026-09-02: tools built on the stock loader (official `luac`, luadec, rizin, ChunkSpy) refuse those chunks by name; the -two unluac lineages read them correctly. luad 0.3.0 refuses unsupported numeric layouts +two unluac lineages read them correctly. luad 0.3.1 refuses unsupported numeric layouts at the header; it does not provide an EdgeTX profile. This dated comparison informs the work. No goal here requires other tools to remain diff --git a/fuzz/Cargo.lock b/fuzz/Cargo.lock index 4117971..4ecacfa 100644 --- a/fuzz/Cargo.lock +++ b/fuzz/Cargo.lock @@ -137,7 +137,7 @@ dependencies = [ [[package]] name = "luad-analysis" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -154,7 +154,7 @@ dependencies = [ [[package]] name = "luad-core" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "schemars", @@ -166,7 +166,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua51" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -178,7 +178,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua52" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -190,7 +190,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua53" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua54" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core", @@ -214,7 +214,7 @@ dependencies = [ [[package]] name = "luad-dialect-lua55" -version = "0.3.0" +version = "0.3.1" dependencies = [ "hex", "luad-core",