From b5f51415caa51244745a1a3ae9d772089ff45b70 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 14 Oct 2026 15:57:38 +0800 Subject: [PATCH] =?UTF-8?q?fix(vpsdk):=20so=5Fcall1=20=E7=9A=84=20arg1=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=20rawptr=EF=BC=88=E8=A3=B8=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E7=94=A8=E9=80=9A=E9=85=8D=E6=8C=87=E9=92=88=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E7=BA=A7=E6=95=B0=E4=B8=8D=E7=AC=A6=E8=AF=AF=E6=8A=A5?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dynlib.so_call1 的 arg1 只是原样交给系统调用的裸地址;原先声明为 t.CPtr(具体类型的 一级指针),调用方传字符串字面量(二级指针)会命中 CastError: implicit pointer-to-pointer conversion is forbidden: pointer level differs (source level 2 -> target level 1) 改用 rawptr(未定/通配指针,符合既有规则“任一侧 void*/未定(rawptr)允许”)。 --- vpsdk/dynlib.vp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vpsdk/dynlib.vp b/vpsdk/dynlib.vp index 2cb6a04..dc84f1f 100644 --- a/vpsdk/dynlib.vp +++ b/vpsdk/dynlib.vp @@ -4,5 +4,8 @@ from . import syscall as syscall def load_so(path: const str) -> uint64: return syscall._syscall1(uint64(syscall.LOAD_SO), uint64(path)) -def so_call1(sym_name: const str, arg1: t.CPtr) -> int: +def so_call1(sym_name: const str, arg1: rawptr) -> int: + # arg1 只是原样交给系统调用的裸地址,故用 rawptr(未定/通配指针)而非 t.CPtr: + # 后者是具体类型的一级指针,调用方传字符串字面量(二级指针)会被判成级数不符 + # (CastError: pointer level differs, source level 2 -> target level 1)。 return int(syscall._syscall2(uint64(syscall.SO_CALL1), uint64(sym_name), uint64(arg1)))