我想用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);
}
答案 0 :(得分:2)
您的readString
函数已损坏(它永远不会初始化tmp
,因此它指向scanf
然后尝试编写的随机内存位置,调用未定义的行为)并且可能会导致任何使用它的程序中的段错误,无论它是用LLVM还是C编写的。
您的LLVM代码没有任何问题 - 不需要任何细节。鉴于正确定义的readString
函数,代码将完美地运行。