[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