modernc.org/sqlite: 修复 Cache 释放固定页导致的静默数据库损坏
pagecache_trampolines.go: panic when a Cache drops a pinned page
Go 开发者使用 modernc.org/sqlite 进行纯 Go 环境开发时,此修复至关重要。旧版本会导致严重的静默数据损坏,升级后可通过 panic 及时发现此类并发与内存管理错误,避免线上数据灾难。
每当 Cache 返回 nil 或不同的 Page 时,Fetch 都会将其持有的该键对应的 stub 标记为已废弃。这对于未固定的键是正确的,但对于已固定的键则是释放后使用(use-after-free):在绑定释放了 stub 的页面后,SQLite 仍会继续读写该页面,导致数据库损坏且无任何错误提示。Page 契约禁止 Cache 这样做,但此前并无检查机制。由于绑定能观察到所有的 pin 和 unpin 操作,因此现在它会记录 SQLite 持有的 stub——由 Fetch 设置、Unpin 清除、Truncate 和 Destroy 丢弃——并在发生违规时触发 panic 而非释放内存。崩溃能暴露 bug;静默的损坏则不能。modernc.org/sqlite/pcache 遵守该契约且不受影响。成本:每个 stub 增加一个 bool 值。顺便更正了线程相关的注释:原注释称因无共享缓存模式而保持串行化,但在 file: DSN 中使用 cache=shared 时,回调会从多个 goroutine 到达,并由 SQLite 的 BtShared 互斥锁进行串行化。pagecache_pin_test.go 通过故意破坏的 Cache(在固定期间保留、替换和丢弃,以及在取消固定后替换和丢弃)来驱动这些跳板函数。此问题是在审查 Ian Chechin 起草的页缓存威胁模型时发现并修复的。Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_013BCJoyr39m6k43FmuN9qpj
更进一步:量化金融体系
看懂新闻只是起点——沿量化金融路径,把它变成能交付的工程能力