Ошибка передачи данных из символьного массива в функцию

При передаче символьного массива в функцию, переносится какая-то белиберда, причем не имеет значения, что конкретно находилось в массиве.

При получении данных в массив msg всё проходит гладко и они записываются как надо.

void * thread1(void* thread_data)
{
    int cunt = counter;
    int bytes = 0;
    char msg[40];
    while(true)
    {
        bytes = recv(Con[cunt], msg, 40, NULL);
        if(bytes <= 0) break;
        _sd(msg, cunt);
        disconnect(cunt);
    }

    _is_free[cunt] = true;
    pthread_exit(0);
}


void _sd(char msg[], int in)
{
    int offset = 0;
    int _flen = 0;
    int _finfo[STD_FLEN+1];
    int t = 0;
    while(true)
    {
        t = _readf1024(msg, _finfo, offset, _flen);
        sendfile(_finfo, _flen, in);
        if(t == EOF) break;
    }
}

Я проверял в дебаггере, что же конкретно не так, однако и это мне не дало толком понять, что происходит.

Ошибка происходит по адресу 000055EA4AC0068A, собственно при копировании полученных данных из массива в стек.

.text:000055EA4AC0067E                 public _Z3_sdPci
.text:000055EA4AC0067E _Z3_sdPci       proc near               ; CODE XREF: thread1(void *)+5D↓p
.text:000055EA4AC0067E
.text:000055EA4AC0067E in              = dword ptr -405Ch
.text:000055EA4AC0067E msg             = qword ptr -4058h
.text:000055EA4AC0067E _finfo          = dword ptr -4050h
.text:000055EA4AC0067E _flen           = dword ptr -48h
.text:000055EA4AC0067E offset          = dword ptr -44h
.text:000055EA4AC0067E _fname          = byte ptr -40h
.text:000055EA4AC0067E t               = dword ptr -14h
.text:000055EA4AC0067E var_8           = qword ptr -8
.text:000055EA4AC0067E
.text:000055EA4AC0067E ; __unwind { // 55EA4ABFF000
.text:000055EA4AC0067E                 push    rbp
.text:000055EA4AC0067F                 mov     rbp, rsp
.text:000055EA4AC00682                 push    rbx
.text:000055EA4AC00683                 sub     rsp, 4058h
.text:000055EA4AC0068A                 mov     [rbp+msg], rdi
.text:000055EA4AC00691                 mov     [rbp+in], esi
.text:000055EA4AC00697                 mov     rax, [rbp+msg]
.text:000055EA4AC0069E                 mov     rcx, [rax]
.text:000055EA4AC006A1                 mov     rbx, [rax+8]
.text:000055EA4AC006A5                 mov     qword ptr [rbp+_fname], rcx
.text:000055EA4AC006A9                 mov     qword ptr [rbp+_fname+8], rbx
.text:000055EA4AC006AD                 mov     rcx, [rax+10h]
.text:000055EA4AC006B1                 mov     rbx, [rax+18h]
.text:000055EA4AC006B5                 mov     qword ptr [rbp+_fname+10h], rcx
.text:000055EA4AC006B9                 mov     qword ptr [rbp+_fname+18h], rbx
.text:000055EA4AC006BD                 mov     rax, [rax+20h]
.text:000055EA4AC006C1                 mov     qword ptr [rbp+_fname+20h], rax
.text:000055EA4AC006C5                 mov     [rbp+offset], 0
.text:000055EA4AC006CC                 mov     [rbp+_flen], 0
.text:000055EA4AC006D3                 mov     [rbp+t], 0
.text:000055EA4AC006DA
.text:000055EA4AC006DA loc_55EA4AC006DA:                       ; CODE XREF: _sd(char *,int)+9A↓j
.text:000055EA4AC006DA                 lea     rcx, [rbp+_flen] ; _flen
.text:000055EA4AC006DE                 lea     rdx, [rbp+offset] ; offset
.text:000055EA4AC006E2                 lea     rsi, [rbp+_finfo] ; _finfo
.text:000055EA4AC006E9                 lea     rax, [rbp+_fname]
.text:000055EA4AC006ED                 mov     rdi, rax        ; _fname
.text:000055EA4AC006F0                 call    _Z10_readf1024PcPiRiS1_ ; _readf1024(char *,int *,int &,int &)
.text:000055EA4AC006F5                 mov     [rbp+t], eax
.text:000055EA4AC006F8                 mov     ecx, [rbp+_flen]
.text:000055EA4AC006FB                 mov     edx, [rbp+in]   ; in
.text:000055EA4AC00701                 lea     rax, [rbp+_finfo]
.text:000055EA4AC00708                 mov     esi, ecx        ; _flen
.text:000055EA4AC0070A                 mov     rdi, rax        ; _finfo
.text:000055EA4AC0070D                 call    _Z8sendfilePiii ; sendfile(int *,int,int)
.text:000055EA4AC00712                 cmp     [rbp+t], 0FFFFFFFFh
.text:000055EA4AC00716                 jz      short loc_55EA4AC0071A
.text:000055EA4AC00718                 jmp     short loc_55EA4AC006DA
.text:000055EA4AC0071A ; ---------------------------------------------------------------------------
.text:000055EA4AC0071A
.text:000055EA4AC0071A loc_55EA4AC0071A:                       ; CODE XREF: _sd(char *,int)+98↑j
.text:000055EA4AC0071A                 nop
.text:000055EA4AC0071B                 nop
.text:000055EA4AC0071C                 mov     rbx, [rbp+var_8]
.text:000055EA4AC00720                 leave
.text:000055EA4AC00721                 retn

Данные, которые хранит массив (как раз rdi) msg --

00007F296241CEA0 db  74h ; t
00007F296241CEA1 db  65h ; e
00007F296241CEA2 db  73h ; s
00007F296241CEA3 db  74h ; t
00007F296241CEA4 db  2Eh ; .
00007F296241CEA5 db  65h ; e
00007F296241CEA6 db  78h ; x
00007F296241CEA7 db  65h ; e

Данные, которые копируются в стек функции _sd()

00007F2962418E28 db 0A0h
00007F2962418E29 db 0CEh
00007F2962418E2A db  41h ; A
00007F2962418E2B db  62h ; b
00007F2962418E2C db  29h ; )
00007F2962418E2D db  7Fh ; 

Собственно вопрос, что конкретно я делаю не так?


Ответы (0 шт):