0

更新: 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

私が間違っていることについて誰かが私にいくつかのヒントを与えることができますか?

4

2 に答える 2

0

あなたのCコードであなたが書いた

free(name)

malloc 、 calloc または realloc のいずれかによって割り当てられていないメモリを解放できないため、問題を引き起こしている可能性があります。

于 2012-10-13T19:38:20.440 に答える
0

アセンブリ ルーチンの最後に、戻り値を にロードしますeax

movl    -12(%ebp), %eax

ただし、-12(%ebp)割り当てられたポインターではなく、関数に渡されたポインターが含まれます。代わりに、戻る直前に次のことを行う必要があります。

movl    -16(%ebp), %eax

eax(または何もしないでください - 命令から戻った後、何も変更されていないようですcall allocate)。

于 2012-10-13T21:30:10.243 に答える