我想写一个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
函数,代码将完全正常工作。