为什么我会在这里遇到分段错误?

问题描述 投票:0回答:1
declare i32 @vprintf(i8*, i8*)
declare i32 @printf(i8*, ...)

declare void @llvm.va_start(i8*)
declare void @llvm.va_end(i8*)

@.str_3 = private unnamed_addr constant [2 x i8] c"\0A\00"
@.str_5 = private unnamed_addr constant [13 x i8] c"number is %i\00"

define void @println(i8* %a, ...) {
entry:
    %zk.ellipsis = alloca i8*
    call void @llvm.va_start(i8* %zk.ellipsis)
    %t1 = call i32 @vprintf(i8* %a, i8* %zk.ellipsis)
    %t2 = call i32 @printf(i8* @.str_3)
    call void @llvm.va_end(i8* %zk.ellipsis)
    ret void
}

define void @main() {
entry:
    call void @println(i8* @.str_5, i32 5)
    ret void
}

运行此程序时,我得到输出:

number is 5
Segmentation fault (core dumped)

我想要输出的内容得到了输出,但最后出现了分段错误。我该如何解决这个问题?这是我为我正在制作的编译器所做的,所以这就是为什么有些指令可能是多余的并且可以减少,但是是的。

segmentation-fault llvm variadic-functions variadic
1个回答
0
投票

这里的段错误是由于可变参数指针的错误使用造成的。在

println
函数中,您将
zk.ellipsis
分配为
i8*
,它保存指向可变参数列表的指针。但是,它们需要一个指向实际参数的
i8*
,而不是指向指针的指针。

define void @println(i8* %a, ...) {
entry:
    %zk.ellipsis = alloca i8     # Change i8* to i8 here
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.