Full Changelog: v5.5.0...v5.5.3
pip install codecin==5.5.3[5.5.3] - 2026-09-26
以「消除静默算错地址」为主线的一次修复发布:两个会读错/写错内存且不报错的
代码生成缺陷,配套文档站独立与 CI 适配。
修复 (Fixed)
嵌套下标算错基址(静默读写错误内存)
A[B[i]]一类的嵌套下标把外层基址弄丢。编译器约定是"任何跨子表达式存活
的临时值都存栈",但_gen_index把数组/字符串基址暂存在x3才去求下标;
内层下标自己也要用x3存基址,于是外层ADD用的是内层数组的基址:
A[B[i]]被算成&B[0],读取静默得到错值、赋值静默写到别的变量内存上
(不越界、不报错)。实测 11 个用例里 10 个算错。
现在基址改为入栈(PUSH/POP),Python 与 Go 两个编译器同步修复。- 同类缺陷一并修掉:
_gen_assign把待写入的值放在x2之后才求左值地址
(A[f(i)] = v会存错值);gen_init_2d_literal把行指针数组x4、当前行
x5跨元素表达式存活(int[][] m = {{g(1), g(2)}, ...}元素含函数调用时写错行)。
两处均改为求值前入栈。
浮点下标被当成字节偏移
G_C[(lo + hi) / 2]抛address 379800000000000 out of bounds
(issue #1)。/恒为浮点除法,所以下标类型是 float,而_gen_index是唯一
漏掉"int 上下文隐式截断"的地方:float 的 IEEE-754 位模式被直接当作字节偏移
乘 8(249.5 的位模式 × 8 =0x0379_8000_0000_0000,正是报告里那个恒定高位
0x3798)。标准 Hoare 快排因此完全无法运行。现在数组与字符串下标都会先按
与int x = 1.9一致的规则向零截断,且截断发生在边界检查之前。
变更 (Changed)
- 文档站迁至独立仓库 Code-CIN-Docs:
本仓库不再内嵌docs/子模块(.gitmodules不再使用),README 相应改为单独克隆;
ISA 指令表文档一致性由文档仓库自己保证(script/gen_isa_docs.py保留为生成器)。 - CI 适配 Node 20 下线(GitHub 于 2026-09-23 移除 Node 20 运行时):工作流里
全部动作升级到 Node 24 版本 ——checkout@v6、setup-python@v7、setup-go@v7、
upload-artifact@v7、download-artifact@v7、softprops/action-gh-release@v3。 - 修复
release.yml的非法工作流:4 个 checkout 步骤各写了两个with:键,
GitHub 会判Invalid workflow file(发布流程此前根本跑不起来)。同时移除所有
submodules: recursive与已失效的文档一致性检查步骤。 requirements-dev.txt补PyYAML:tests/test_workflows.py用
pytest.importorskip('yaml'),缺依赖时整块门禁被静默跳过 —— 上面那个重复键
错误就是这样漏过 CI 的。该文件现在还会检测同层重复键(PyYAML 默认静默
后者覆盖前者)。.gitignore/leak-check 排除表补.gotmp、.gocache、pytest-cache-*
(都是记录在案的临时/构建目录);MANIFEST.in去掉已不存在的docs/条目。
测试 (Tests)
- 新增
tests/test_nested_subscript_codegen.py:17 个嵌套下标用例 × 解释器/JIT/
原生三条路径,另有"写A[B[i]]不得触碰B的内存"用例;回退修复后 52 条中
46 条失败。 codecin/native/compiler/compile_test.go新增同类 Go 侧用例(编译后直接在
Go VM 中执行)。