2015-02-07 3 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, какими-либо советы?

EDIT: Это, как я реализовал мои 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

+0

Он бросает segfault, когда? Когда вы компилируете свой код или запускаете его? – arrowd

+0

Да, когда я запускаю код llvm – niczka

ответ

2

Ваша readString функция нарушена (она никогда не процессе инициализации tmp, так что указывает на случайное место памяти, к которой scanf затем пытается писать, ссылаясь неопределенное поведение) и, вероятно, вызовет segfault в любой программе, которая его использует, независимо от того, написана ли она в LLVM или C.

Нет ничего плохого в вашем коде LLVM - никакие бит-файлы не требуются. Код будет работать отлично, если задана правильно определенная функция readString.

+0

Итак, что мне следует делать в readString? – niczka

+0

@niczka Выделите память для строки, а затем убедитесь, что вы не читаете больше этого количества символов (имея в виду нулевой ограничитель). Если вы хотите читать произвольно большие строки, вам нужно прочитать строку в кусках и перераспределить динамически. – sepp2k

Смежные вопросы