Cx 开发日志 — 2026-04-25

发布: (2026年4月26日 GMT+8 08:38)
5 分钟阅读
原文: Dev.to

Source: Dev.to

打破子主函数六天停滞

我们终于达成了一个重要里程碑:四项提交将 Cx 0.1 推进至候选发布(release‑candidate)状态。一次重要的内存边界审计发现了一个关键的 StrRef 可靠性漏洞,现已修复,所有九个硬阻塞全部清除,唯一剩下的主要步骤是合并差距,随后即可宣布正式发布。

提交 a576f20

  • 涉及文件: parser.rs, semantic.rs, main.rs, runtime.rs
  • 新增: 六个矩阵测试(t109 至 t114
  • 重构: 将类型解析器从平面备选方案改为 recursive() 方式,使其能够解析嵌套类型,如 ResultHandle,这曾是复杂泛型的阻碍。

语义分析改进

  • 加强了对结构体定义中字段类型的解析,以支持 DotAccess 左值。
  • 拒绝类型不匹配的情况。
  • runtime 中的 apply_numeric_cast 现在会依据左值的声明类型进行适配,适用于 AssignCompoundAssign

运行时栈升级

  • 为解释器引入了专用的 64 MB 栈线程,防止递归 Cx 程序出现栈溢出。

统计信息: 17 个文件变更,净增 119 行。

提交 41099fb – 内存审计示例

examples/audit_memory/ 中新增了 12 个针对性测试程序,检查:

  • Handle 生命周期
  • 拷贝语义
  • 字符串 arena 操作

结果

  • 9 项测试全部通过
  • 1 项已知的 arena 扩展限制(在 v0.1 中接受)
  • 1 项有意的语义拒绝
  • 1 项关键可靠性漏洞被发现(已在下一个提交中修复)

关键 StrRef 问题的修复(b057340)

该漏洞允许 StrRef 值进入结构体字段,绕过当前的逃逸检查——这些检查会阻止在变量赋值和函数返回时出现此类条目。

  • semantic.rs 中新增的安全层现在会在结构体字段赋值和实例化时阻止这些潜在的逃逸。
  • 新增矩阵测试 t115 用于确认修复效果(预期失败),确保对 arena 支持的字符串引用实行更严格的作用域约束。
  • 未发现其他逃逸路径,但仍需保持警惕。

三项决定性决策塑造未来

StrRef 与结构体字段

所有通过结构体字段的 StrRef 逃逸路径已被关闭,符合现有策略,彻底封堵了最后的漏洞。

Handle 双重释放视为静默无操作

审计表明,Handle 的代数索引能够安全处理双重释放而不产生问题。未来版本可能会加入警告,但目前它仍是一个静默的守护者。

64 MB 解释器栈方案

一种简单的解决方案——在专用线程上分配 64 MB 栈——解决了递归 Cx 程序的栈溢出问题,无需复杂的每帧调优。对 v0.1 来说已足够高效;后续计划进一步压缩。

绘制通往 v5.0 及更远的路线图

提交 587bd20 将子主函数路线图提升至 v5.0,移除所有九个障碍基准。已知的局限性现在已透明化。

  • 子主函数: 19 项新提交
  • 主函数: 约 15 项提交待合并

即将进行的合并将把主矩阵从 78 增至 117 项测试,囊括所有硬阻塞的解决方案。

合并后重点

  • 运营整理(例如 daily‑log 分支)
  • 使用 := 类型推断和模式匹配改进来提升质量门槛
  • 为新构造进行 IR 降级

这些并非 v0.1 的直接阻塞因素,但会在后续版本中提升开发者体验。

所有可靠性问题已修补,所有阻塞已解决,从 RC 到稳定发布的路径已清晰。接下来的步骤是整合与细化,以将 Cx 0.1 推向正式稳定版。

关注 Cx 语言项目

  • 网站:
  • GitHub:
  • Dev.to:
  • Bluesky:
  • Twitter/X: @commenterthe9
0 浏览
Back to Blog

相关文章

阅读更多 »