well this is invalid in c as u need to allocate enough memory to be able to copy the 2nd string  , if not enough allocated mem is available then it will overwrite address available, corrupting the memory. :)<br><br>regards
<br>faraz<br><br><div class="gmail_quote">On Jan 6, 2008 11:52 PM, Zalunin Pavel <<a href="mailto:wr4bbit@gmail.com">wr4bbit@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
hm.... I think, that is valid in c<br><br>but next code too doesn't works right:<br>; ModuleID = 'sample.lz'<br>@.str1 = internal global [6 x i8] c"world\00"           ; <[6 x i8]*> [#uses=1]<br>

@.str2 = internal global [7 x i8] c"hello \00"          ; <[7 x i8]*> [#uses=1]<br>@.str7 = internal global [7 x i8] c"father\00"          ; <[7 x i8]*> [#uses=1]<br>@.str8 = internal global [8 x i8] c"mother \00"         ; <[8 x i8]*> [#uses=1]
<div class="Ih2E3d"><br><br>declare i32 @puts(i8*)<br><br>declare i8* @strcat(i8*, i8*)<br><br></div>declare i32 @strlen(i8*)<div class="Ih2E3d"><br><br>declare void @llvm.memcpy.i32(i8*, i8*, i32, i32)<br><br>define i32 @main() {
<br>mainBlock:<br></div>        %str3 = getelementptr [7 x i8]* @.str2, i64 0, i64 0            ; <i8*> [#uses=2]
<br>        %str4 = getelementptr [6 x i8]* @.str1, i64 0, i64 0            ; <i8*> [#uses=1]<br>        call i8* @strcat( i8* %str3, i8* %str4 )                ; <i8*>:0 [#uses=0]<br>        %tmp6 = call i32 @puts( i8* %str3 )             ; <i32> [#uses=0]
<br>        %str9 = getelementptr [8 x i8]* @.str8, i64 0, i64 0            ; <i8*> [#uses=2]<br>        %str10 = getelementptr [7 x i8]* @.str7, i64 0, i64 0           ; <i8*> [#uses=1]<br>        call i8* @strcat( i8* %str9, i8* %str10 )               ; <i8*>:1 [#uses=0]
<br>        %tmp12 = call i32 @puts( i8* %str9 )            ; <i32> [#uses=0]<br>        ret i32 0<br>}<br><br><br>writes:<br>%<br>hello world<br>mother orld<br><br><br>I tried decompile code:<br> main(int argc, char **argv) {
<br>  char str1[] = "mother ";<br>  strcat(str1, "father");<br>  return 0;<br>}<br><br>decompiler gives to me code, in this code string " mother\0" presents as:<br><pre>%str1 = <span>
alloca</span> [8 x <span>i8</span>], align 16         ; <[8 x <span>i8</span>]*> [#uses=9]<br>        %tmp1 = <span>getelementptr</span> [8 x <span>i8</span>
]* %str1, <span>i32</span> 0, <span>i32</span> 0                ; <<span>i8</span>*> [#uses=2]<br>      <span>store</span> <span>i8</span> 109, 
<span>i8</span>* %tmp1, align 16<br>  %tmp4 = <span>getelementptr</span> [8 x <span>i8</span>]* %str1, <span>i32</span> 0, <span>
i32</span> 1              ; <<span>i8</span>*> [#uses=1]<br>      <span>store</span> <span>i8</span> 111, <span>i8</span>* %tmp4, align 1<br>   %tmp7 = <span>
getelementptr</span> [8 x <span>i8</span>]* %str1, <span>i32</span> 0, <span>i32</span> 2             ; <<span>i8</span>*> [#uses=1]<br>      <span>
store</span> <span>i8</span> 116, <span>i8</span>* %tmp7, align 1<br>       %tmp10 = <span>getelementptr</span> [8 x <span>i8</span>]* %str1, <span>
i32</span> 0, <span>i32</span> 3              ; <<span>i8</span>*> [#uses=1]<br>      <span>store</span> <span>i8</span> 104, <span>i8</span>
* %tmp10, align 1<br>     %tmp13 = <span>getelementptr</span> [8 x <span>i8</span>]* %str1, <span>i32</span> 0, <span>i32</span> 4                ; <<span>
i8</span>*> [#uses=1]<br>        <span>store</span> <span>i8</span> 101, <span>i8</span>* %tmp13, align 1<br>  %tmp16 = <span>getelementptr</span> [8 x 
<span>i8</span>]* %str1, <span>i32</span> 0, <span>i32</span> 5             ; <<span>i8</span>*> [#uses=1]<br>      <span>store</span> <span>
i8</span> 114, <span>i8</span>* %tmp16, align 1<br>     %tmp19 = <span>getelementptr</span> [8 x <span>i8</span>]* %str1, <span>i32</span> 0, <span>
i32</span> 6              ; <<span>i8</span>*> [#uses=1]<br>      <span>store</span> <span>i8</span> 32, <span>i8</span>* %tmp19, align 1<br>   %tmp22 = <span>
getelementptr</span> [8 x <span>i8</span>]* %str1, <span>i32</span> 0, <span>i32</span> 7             ; <<span>i8</span>*> [#uses=1]<br><br>    <span>
store</span> <span>i8</span> 0, <span>i8</span>* %tmp22, align 1</pre><br>it's looks funny, can you say another less complex way to do this operation?<br>Thanks<br><br>Best regards, 
<br><font color="#888888">    Zalunin Pavel<br>
</font><br>_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu
</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br><br></blockquote></div><br><br clear="all"><br>-- <br>Syed Faraz Mahmood<br>web  :  
<a href="http://www.farazmahmood.com">http://www.farazmahmood.com</a><br>blog  :  <a href="http://farazmahmood.wordpress.com">http://farazmahmood.wordpress.com</a>