Skip to content

[BUG] 1-layout+2-runtime: 局部 Ptr 的 *p 解引用与经指针访问失效(*p panic;p[0] fs 脏值但 shm 正确;p·[0] 静默 None) #305

Description

@miaobyte

环境

  • 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] 两种经指针访问。

验收建议

  1. A:*p(p 为局部 *T)按"解引用该 Ptr"下降级并由 runtime 正确取值 → q= 42;不得 panic。
  2. B:定语义(建议「先解引用再下标」,与 p·field 的按指针优先一致),fs/shm/redis 三后端同值。
  3. C:compact 数组经 Ptr 的坐标访问直接报 TypeError(不静默 None),错误串点明"compact 数组用 [] 索引"。
  4. 上三条各补一个 tutorial 锚例(A/B 通过、C 期望报错)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    BUG缺陷:与 spec 或预期行为不符

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions