LLVM字符串输入/输出

时间:2015-02-07 12:20:18

标签: c string pointers llvm

我想用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);
}

1 个答案:

答案 0 :(得分:2)

您的readString函数已损坏(它永远不会初始化tmp,因此它指向scanf然后尝试编写的随机内存位置,调用未定义的行为)并且可能会导致任何使用它的程序中的段错误,无论它是用LLVM还是C编写的。

您的LLVM代码没有任何问题 - 不需要任何细节。鉴于正确定义的readString函数,代码将完美地运行。