Портирование 32-разрядной на 64-разрядную программу C "Исключение: нарушение прав чтения 0xC0000005" - PullRequest
0 голосов
/ 05 октября 2018

Я использую VS2017 и имею следующие строки кода C (извините, я не могу опубликовать все содержимое функции):

char        *dptr;                  /* Global variables */
static u_int16_t vers;  
...
static int32_t 
read_row(database_t *dbase, table_t *table, int32_t col_flag, int32_t flag) {

    row_t       *rowptr;
    char        marker;
    void        *new_row;
    table_t     *t_new;
    size_t      row_length;
    size_t      row_ =  1;

    marker = *dptr++;

    if (vers < VERS && marker != ROW) {
        return -1;
    }   

    /* Create a new row */
    t_new = table;
    row_length = t_new->row_length;
    new_row = calloc(row_, row_length);
    rowptr = new_row;
    if (rowptr == NULL)
    return -1;
    ... 

Последняя строка вызывает «Исключение, выданное в 0x00000000778745A0 (ntdll.dll)) в ****. exe: 0xC0000005: ошибка чтения прав доступа 0x00000000787745A0 "ошибка.

Во время отладки, когда я наведите указатель мыши на calloc, я вижу, что его значение равно" 0x000000013f63dc94 ".Но почему-то выдается исключение, и это значение никогда не присваивается new_row (его значение остается «0xcccccccccccccccc»).

Я заметил, что это исключение выдается, когда calloc имеет значение> "0x00000001 ********".Кажется, работает нормально, если 8 MSB адреса равны 0. Определение calloc () взято из corecrt.malloc.h:

_Check_return_ _Ret_maybenull_ _Post_writable_byte_size_(_Count * _Size)
_ACRTIMP _CRT_JIT_INTRINSIC _CRTALLOCATOR _CRTRESTRICT
void* __cdecl calloc(
    _In_ _CRT_GUARDOVERFLOW size_t _Count,
    _In_ _CRT_GUARDOVERFLOW size_t _Size
    );

Любые идеи о том, что может быть причиной этого исключения и как исправитьэто будет оценено.Кстати, я использую Win 7 Pro с 8 ГБ оперативной памяти.

...