* Dmitry V. Levin [081109 15:10]: > Я пока не улавливаю суть происходящего с mutt_md5. Код (md5_process_bytes): /* Move remaining bytes in internal buffer. */ if (len > 0) { size_t left_over = ctx->buflen; memcpy (&((char *) ctx->buffer)[left_over], buffer, len); left_over += len; if (left_over >= 64) { md5_process_block (ctx->buffer, 64, ctx); left_over -= 64; memcpy (ctx->buffer, &ctx->buffer[16], left_over); } ctx->buflen = left_over; } Соответственно затык происходит на первом memcpy. (gdb) run Starting program: /home/raorn/src/gitsnaps/packages/mutt1.5/work/mutt-1.5.18/mutt_md5 foobar Breakpoint 1, md5_process_bytes (buffer=0xbfd62df4, len=7, ctx=0xbfd63e3c) at md5.c:223 223 if (ctx->buflen != 0) (gdb) nexti 220 { (gdb) 0x080497ac 220 { (gdb) 0x080497af 220 { (gdb) 0x080497b2 220 { (gdb) 223 if (ctx->buflen != 0) (gdb) 0x080497b8 223 if (ctx->buflen != 0) (gdb) 0x080497ba 223 if (ctx->buflen != 0) (gdb) 247 if (len >= 64) (gdb) 0x080497bf 247 if (len >= 64) (gdb) 269 if (len > 0) (gdb) 0x080497c3 269 if (len > 0) (gdb) 271 size_t left_over = ctx->buflen; (gdb) 52 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); (gdb) 271 size_t left_over = ctx->buflen; (gdb) 52 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); (gdb) 0x080497e5 52 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); (gdb) 0x080497e9 52 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); (gdb) 274 left_over += len; (gdb) 52 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); (gdb) 0x080497f2 52 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); (gdb) ^C Program received signal SIGINT, Interrupt. memcpy (__dest=0xbfd62df4, __src=0x7, __len=3218488892) at /usr/include/bits/string3.h:52 52 return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); Здесь __dest == buffer, __src == len, __len == ctx, т.е. то самое, что передали в md5_process_bytes. Результат (неполный) disasssemble: 0x080497a0 : push %ebp 0x080497a1 : mov %esp,%ebp 0x080497a3 : sub $0x28,%esp 0x080497a6 : mov 0x10(%ebp),%eax 0x080497a9 : mov %esi,0xfffffff8(%ebp) 0x080497ac : mov 0xc(%ebp),%esi 0x080497af : mov %ebx,0xfffffff4(%ebp) 0x080497b2 : mov %edi,0xfffffffc(%ebp) 0x080497b5 : mov 0x18(%eax),%edi 0x080497b8 : test %edi,%edi 0x080497ba : jne 0x8049830 0x080497bc : cmp $0x3f,%esi 0x080497bf : ja 0x8049808 0x080497c1 : test %esi,%esi 0x080497c3 : jne 0x80497d8 0x080497c5 : mov 0xfffffff4(%ebp),%ebx 0x080497c8 : mov 0xfffffff8(%ebp),%esi 0x080497cb : mov 0xfffffffc(%ebp),%edi 0x080497ce : mov %ebp,%esp 0x080497d0 : pop %ebp 0x080497d1 : ret 0x080497d2 : lea 0x0(%esi),%esi 0x080497d8 : mov 0x10(%ebp),%eax 0x080497db : mov 0x8(%ebp),%edx 0x080497de : mov 0x18(%eax),%ebx 0x080497e1 : mov %esi,0x8(%esp) 0x080497e5 : mov %edx,0x4(%esp) 0x080497e9 : lea 0x1c(%eax,%ebx,1),%eax 0x080497ed : add %ebx,%esi 0x080497ef : mov %eax,(%esp) 0x080497f2 : call 0x8049650 0x080497f7 : cmp $0x3f,%esi А вот во что компилится вышеприведённый кусок кода без -O2: 0x08048a40 : mov 0x10(%ebp),%eax 0x08048a43 : mov 0x18(%eax),%eax 0x08048a46 : mov %eax,0xfffffff0(%ebp) 0x08048a49 : mov 0x10(%ebp),%eax 0x08048a4c : add $0x1c,%eax 0x08048a4f : mov %eax,%edx 0x08048a51 : add 0xfffffff0(%ebp),%edx 0x08048a54 : mov 0xc(%ebp),%eax 0x08048a57 : mov %eax,0x8(%esp) 0x08048a5b : mov 0x8(%ebp),%eax 0x08048a5e : mov %eax,0x4(%esp) 0x08048a62 : mov %edx,(%esp) 0x08048a65 : call 0x80483fc 0x08048a6a : mov 0xc(%ebp),%eax 0x08048a6d : add %eax,0xfffffff0(%ebp) 0x08048a70 : cmpl $0x3f,0xfffffff0(%ebp) Куда копать? (ц) -- Regards, Sir Raorn.