modernc.org/sqlite: 修复 TLS 并发中断导致的静默内存损坏
conn: interrupt on a TLS of its own
推荐理由
Go 开发者必读:这是一个破坏性潜在风险的底层修复。如果你依赖 modernc.org/sqlite 处理高并发或频繁取消的场景,必须升级以消除潜在的静默内存损坏风险。
上下文取消调用会从监控上下文的 goroutine 中调用 conn.interrupt,而它中断的查询可能正在 c.tls 上运行。libc.TLS 不适合并发使用,且 c.Lock 仅能防止 Close。之所以安全,仅仅是因为经过转译的 sqlite3_interrupt 是一个单次原子存储操作,从不触碰 TLS,在 lib/ 的所有变体中均如此。没有任何声明或测试保证这一点,而未来若 SQLite 或 ccgo 为该函数引入局部变量,则会将取消操作转化为静默内存损坏。改为在独立的 TLS 上执行中断。在 linux/amd64 上测量,NewTLS 加上 Close 约需 140 ns 和 224 字节,仅在查询实际被中断时才支付此开销;每个连接持有一个 TLS 将在此处使每个连接额外消耗约半千字节,并在其他目标平台上占用 4 KiB 栈段,却毫无收益。TLS 的栈空间永远不会收缩,但仅通过 Alloc 增长,而 sqlite3_interrupt 从未调用 Alloc。此问题在审查 Ian Chechin 起草的连接生命周期威胁模型时发现。共同作者:Claude Opus 5 (1M context) <[email protected]>
更进一步:量化金融体系
看懂新闻只是起点——沿量化金融路径,把它变成能交付的工程能力