2015-02-07 116 views
0

我想在LLVM代码中写入读取两个字符串的函数,将它们连接并打印出来。打印和阅读功能在外部库用C写的LLVM字符串输入/输出

我尝试这样做:

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 
} 

但它抛出:分段故障(核心转储) 我想我需要做一些bitcasting,有什么建议?

编辑:这是我如何实现我的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

你确定你的C函数能正常工作吗? – sepp2k 2015-02-07 12:28:24

+0

它会抛出段错误吗?当你编译你的代码,或运行它? – arrowd 2015-02-07 16:12:43

+0

是的,当我运行llvm代码 – niczka 2015-02-07 22:34:54

回答

2

readString功能坏了(它永远不会初始化tmp,使其指向一个随机的内存位置到scanf然后尝试去写,调用未定义的行为),并且可能会在使用它的任何程序中导致段错误,无论它是使用LLVM还是C编写。

LLVM代码没有任何问题 - 不需要bitcast。鉴于正确定义的readString函数,代码将很好地工作。

+0

那么我应该在readString中进行更改? – niczka 2015-02-08 00:06:36

+0

@niczka为字符串分配内存,然后确保您读取的字符数量不多(记住空终止符)。如果您希望能够读取任意大的字符串,则需要以块的形式读取字符串并动态地重新分配。 – sepp2k 2015-02-08 00:12:49