更新: C コードの例を修正しました。アセンブリで char* から別の char* にコピーしています。値でコピーしてから、新しい char* のアドレスを呼び出し元に返す必要があります。
アセンブリで次の C コードと同等のものを作成しようとしていますが、gdb/valgrind は、既に「解放された」ものを解放しようとしていると報告しています。
C のコード:
char* func( int x, char* name){
namestr = (char *) malloc( strlen(name) + 1 );
nameestr = strdup( namestr, strlen(name) +1 );
free( name ); //Just showing what I plan to do later.
return namestr;
}
int main( ){
char* name = (char *) malloc( 10 );
*name = "0123456789"
char* some_string = func( 10, name );
free( some_string );
}
アセンブリ内のコード:
new_student:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
subl $20, %esp
movl 12(%ebp), %ecx
movl %ecx, %edi
movl %ecx, -12(%ebp)
;get length and allocate the appropriate space
.STR_ALLOCATE:
movl $0, %eax
movl $-1, %ecx
repnz scasb
notl %ecx
subl $1, %eax
addl $1, %eax
movl %ecx, -8(%ebp)
pushl %ecx
call allocate
add $4, %esp
movl %eax, -16(%ebp)
;copy the string byte by byte
.STR_CPY:
movl -8(%ebp), %ecx
movl %eax, %edi
movl 12(%ebp), %esi
rep movsb
movl -12(%ebp), %eax
.END:
popl %esi
popl %edi
leave
ret
私が間違っていることについて誰かが私にいくつかのヒントを与えることができますか?