2015-02-07 158 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