我想写一个LLVM代码函数,它读取两个字符串,连接它们并打印出来。打印和读取函数位于用C编写的外部库中。
我试过这个:

declare void @printString(i8*)
declare i8* @readString()
declare i8* @concat(i8*, i8*)

define i32 @main() {
L1:
    %v2 = call i8* @readString()
    %v4 = call i8* @readString()
    %v5 = call i8* @concat(i8* %v2, i8* %v4)
    call void @printString(i8* %v5)
    %v6 = add i32 0, 0
    ret i32 %v6
}

但它抛出:分段错误(核心转储)
我想我需要做些恶作剧,有什么建议吗?
编辑:这就是我实现C函数的方式:
void printString(char* s)
{
    printf("%s\n", s);
    return;
}

char* readString()
{
    char* tmp;
    scanf("%s", tmp);
    return tmp;
}

char* concat(char* s1, char* s2)
{
    char* t = malloc(strlen(s1)+strlen(s2)+1);
    return strcat(strcpy(t,s1),s2);
}

最佳答案

您的readString函数已损坏(它从不初始化tmp,因此它指向一个随机内存位置,然后scanf会尝试写入,调用未定义的行为),并且可能会在使用它的任何程序中导致segfault,不管它是用LLVM还是C编写的。
你的LLVM代码没有问题-不需要任何位转换。给定一个正确定义的readString函数,代码将完全正常工作。

10-06 03:42