From 51c0e026f4a14b436079413fb32c1c04af6e63c6 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 20 Aug 2026 16:45:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(includes):=20=E9=93=BE=E5=BC=8F=20GSList.ap?= =?UTF-8?q?pend=20=E6=94=B9=E5=B1=80=E9=83=A8=E5=8F=98=E9=87=8F=E5=86=99?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E9=81=BF=E5=85=8D=E6=96=B9=E6=B3=95=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=94=99=E4=BD=8D=E5=86=99=E7=A9=BF=E5=86=85=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 链式 func.Params.append() / func.Blocks.append() / block.Lines.append() 会被编译器解析成 LinkedNode.append 且 this 前移 sizeof(LinkedNode)(兄弟 Mixin 兜底误匹配),写穿 GSList 容器前 48 字节破坏数据结构 → LLvmLiteTest Test 3 崩溃(AddParam/CreateBlock/build_add 后链表损坏,PrintFunction/RenumberSSA 遍历垃圾指针)。 改为局部变量 + 类型参数写法(对齐 function_move_block_to_end 既有正确模式)。 --- includes/llvmlite/__function.vp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/includes/llvmlite/__function.vp b/includes/llvmlite/__function.vp index 37b8d61..18a963b 100644 --- a/includes/llvmlite/__function.vp +++ b/includes/llvmlite/__function.vp @@ -165,15 +165,20 @@ def new_function(pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr, def function_add_param(func: Function | t.CPtr, param: Param | t.CPtr): """将参数追加到函数参数链表""" if func is None or param is None: return - if func.Params is None: return - func.Params.append(param) + # 注意:必须先用局部变量 + 类型参数(对齐 function_move_block_to_end 注释), + # 链式 func.Params.append() 会被编译器解析成 LinkedNode.append 且 this 前移 + # sizeof(LinkedNode)(兄弟 Mixin 兜底误匹配),写穿容器前 48 字节破坏数据结构。 + params: GSList[Param] | t.CPtr = func.Params + if params is None: return + params.append(param) def function_add_block(func: Function | t.CPtr, block: BasicBlock | t.CPtr): """将基本块追加到函数块链表""" if func is None or block is None: return - if func.Blocks is None: return - func.Blocks.append(block) + blocks: GSList[BasicBlock] | t.CPtr = func.Blocks + if blocks is None: return + blocks.append(block) def function_move_block_to_end(func: Function | t.CPtr, block: BasicBlock | t.CPtr): @@ -221,8 +226,9 @@ def function_move_block_to_end(func: Function | t.CPtr, block: BasicBlock | t.CP def block_append_line(block: BasicBlock | t.CPtr, line: Line | t.CPtr): """将指令行追加到基本块""" if block is None or line is None: return - if block.Lines is None: return - block.Lines.append(line) + lines: GSList[Line] | t.CPtr = block.Lines + if lines is None: return + lines.append(line) def block_set_terminated(block: BasicBlock | t.CPtr, val: t.CInt):