fix(includes): 链式 GSList.append 改局部变量写法,避免方法解析错位写穿内存
链式 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 既有正确模式)。
This commit is contained in:
1 parent
d698fad162
commit
51c0e026f4
1 file changed
+12
-6
@@ -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):
|
||||
|
||||
Reference in new issue
Block a user