[LLVMdev] Another memory fun

Brendan Younger brendan at brendanyounger.com
Sun Jan 6 11:07:47 PST 2008


On Jan 6, 2008, at 12:29 PM, Zalunin Pavel wrote:

> Hey again)
>
> Now I have next code:
>
> ; ModuleID = 'sample.lz'
> @.str1 = internal global [8 x i8] c" world!\00"         ; <[8 x  
> i8]*> [#uses=1]
> @.str2 = internal global [8 x i8] c"hello, \00"         ; <[8 x  
> i8]*> [#uses=1]
> @.str7 = internal global [21 x i8] c"welcome to out hall! 
> \00"           ; <[21 x i8]*> [#uses=1]
>
> declare i32 @puts(i8*)
>
> declare i8* @strcat(i8*, i8*)
>
> declare void @llvm.memcpy.i32(i8*, i8*, i32, i32)
>
> define i32 @main() {
> mainBlock:
>         %.str3 = getelementptr [8 x i8]* @.str2, i64 0, i64  
> 0           ; <i8*> [#uses=1]
>         %.str4 = getelementptr [8 x i8]* @.str1, i64 0, i64  
> 0           ; <i8*> [#uses=1]
>         %tmp5 = call i8* @strcat( i8* %.str3, i8*  
> %.str4 )              ; <i8*> [#uses=1]
>         %tmp6 = call i32 @puts( i8* %tmp5 )             ; <i32>  
> [#uses=0]
>         %.str8 = getelementptr [21 x i8]* @.str7, i64 0, i64  
> 0          ; <i8*> [#uses=1]
>         %tmp9 = call i32 @puts( i8* %.str8 )            ; <i32>  
> [#uses=0]
>         ret i32 0
> }

You should look more closely at the man page for strcat().  You have  
to have sufficient space in the buffer for the first argument.   
Otherwise you're trashing memory.

Brendan Younger



More information about the llvm-dev mailing list