环境
- kvlang
c928f43(+ 本地重编 runtime / runtime-rs / layout)、kvspace / kvspace-c / kvspace-durable 本地重编。
- 后端:fs、shm 都测(结果见下,B 例两后端不一致)。
- 入口:
kvlanged <f>.kv fs://<D> 然后 KVSPACE=fs://<D> ./bin/kvlang test。
现象总览
| 例 |
期望 |
fs 实测 |
shm 实测 |
A *p 解引用 |
q= 42 |
❌ panic:/vthread/87/[1]/ is not a Ptr — frame slot missing, param passing broken |
❌ 同 panic |
B p[0] 经指针下标 |
q= 11(或明确报错) |
❌ 静默脏值 q= 7233174018586867247 |
✅ q= 11 |
C p·[0] 经指针坐标 |
报错(compact 数组用 []) |
❌ 静默 q=(None),无报错 |
❌ 同(None) |
对照 D p·val 经指针成员 |
v= 1 |
✅ v= 1 |
✅ |
B 例 fs 与 shm 行为不同 → 违反「三后端语义完全一致」。
A *p 解引用(规范形态)
// 依据:spec 01-词法/09「绝对地址运算符 &」、03-类型系统/16-ptr「四项与 C 对齐」
// &x 产指向 x 的 Ptr(ref=1,body=绝对路径);*p 显式解引用一次,取目标整值。
// 期望输出: q= 42
rwfunc test() -> () {
42 -> x
&x -> p
*p -> q
println("q=", q)
}
实测(fs/shm 同):panic: /vthread/87/[1]/ is not a Ptr — frame slot missing, param passing broken
同源变体(同样 panic):println(*p);把 *p 作实参传给 f(a:[]int64)。
根因线索:panic 文案指向"帧槽缺参数",形如 layout 把局部 Ptr 的 *p 按形参槽形态 *[0,±k] 下降级、runtime 再去帧槽取 Ptr 而该槽并非 Ptr。规范只定义 *[0,±k] 是地址读参的形态(param<0),局部变量的 *p 应是对该局部 Ptr 的解引用。
B p[i] 经指针下标
// 语义待裁决:Ptr base + [] 下标,规范未写;应当是「先解引用再下标」或**明确报错**。
// 期望输出(若语义=先解引用再下标): q= 11
rwfunc test() -> () {
list:[]int64 = [11, 22, 33]
&list -> p
p[0] -> q
println("q=", q)
}
实测:fs q= 7233174018586867247(稳定复现两次);shm q= 11(正确) —— 脏读 + 后端分歧。
C p·[0] 经指针坐标访问
// 依据:spec 03-类型系统/15「容器成员走 ·,[] 只索引 compact 数组」——
// compact 数组用 p[0],不用 p·[0];base 是 Ptr 时也不该静默给 None,应直接报错。
rwfunc test() -> () {
list:[]int64 = [11, 22, 33]
&list -> p
p·[0] -> q
println("q=", q)
}
实测(fs/shm 同):静默 q=(None),无诊断——按 p0/p1(非我定义即 error/panic、不容许奇怪方式成功)应报 TypeError。
对照:正常的路径
// spec 05-runtime语义/03「· 的解引用:按指针优先」——base 是 Ptr 时成员键 = target(base)·field
struct Node { val:int64=0 }
rwfunc test() -> () {
n:Node = Node{val=1} // 帧内名:& 取绝对地址(绝对路径才不需要 &)
&n -> p
p·val -> v // ✅ v= 1
println("v=", v)
}
即:经指针的成员访问已实现,坏的是 *p 解引用与 p[i]/p·[0] 两种经指针访问。
验收建议
- A:
*p(p 为局部 *T)按"解引用该 Ptr"下降级并由 runtime 正确取值 → q= 42;不得 panic。
- B:定语义(建议「先解引用再下标」,与
p·field 的按指针优先一致),fs/shm/redis 三后端同值。
- C:compact 数组经 Ptr 的坐标访问直接报 TypeError(不静默 None),错误串点明"compact 数组用
[] 索引"。
- 上三条各补一个 tutorial 锚例(A/B 通过、C 期望报错)。
环境
c928f43(+ 本地重编 runtime / runtime-rs / layout)、kvspace / kvspace-c / kvspace-durable 本地重编。kvlanged <f>.kv fs://<D>然后KVSPACE=fs://<D> ./bin/kvlang test。现象总览
*p解引用q= 42/vthread/87/[1]/ is not a Ptr — frame slot missing, param passing brokenp[0]经指针下标q= 11(或明确报错)q= 7233174018586867247q= 11p·[0]经指针坐标[])q=(None),无报错p·val经指针成员v= 1v= 1B 例 fs 与 shm 行为不同 → 违反「三后端语义完全一致」。
A
*p解引用(规范形态)实测(fs/shm 同):
panic: /vthread/87/[1]/ is not a Ptr — frame slot missing, param passing broken同源变体(同样 panic):
println(*p);把*p作实参传给f(a:[]int64)。根因线索:panic 文案指向"帧槽缺参数",形如 layout 把局部 Ptr 的
*p按形参槽形态*[0,±k]下降级、runtime 再去帧槽取 Ptr 而该槽并非 Ptr。规范只定义*[0,±k]是地址读参的形态(param<0),局部变量的*p应是对该局部 Ptr 的解引用。B
p[i]经指针下标实测:fs
q= 7233174018586867247(稳定复现两次);shmq= 11(正确) —— 脏读 + 后端分歧。C
p·[0]经指针坐标访问实测(fs/shm 同):静默
q=(None),无诊断——按 p0/p1(非我定义即 error/panic、不容许奇怪方式成功)应报 TypeError。对照:正常的路径
即:经指针的成员访问已实现,坏的是
*p解引用与p[i]/p·[0]两种经指针访问。验收建议
*p(p 为局部*T)按"解引用该 Ptr"下降级并由 runtime 正确取值 →q= 42;不得 panic。p·field的按指针优先一致),fs/shm/redis 三后端同值。[]索引"。