Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> heap corruption, heap corruption 
V
    Опции темы
awesome
Дата 18.11.2010, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Код

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
void get_keys(char arr[8][32], char* ar);
void get_open_code(char* mess, char* ar);
void get_file_size(int* fs, char* ar);
void get_blocks(char** bs, char* msg, int fs);
void main_step_crypt(char k[8][32], char* l, char* r, int key_n);
void char_to_dec(char a[8][32],  int f, char* ah, int bits_num, int byts_num);
void empty_change(char* sm, char table[8][16], char* ssmpl);
void ciclic_shift(char* arr);
void dec_to_char(char* arr, float* out);
void my_xor(char* l, char* sxor);
void get_L_R(char* l, char* r, char** bs,int block_n);
void get_crypt_block(char* r, char* l, char* cr_block);
void decrypt(char k[8][32], int fs, char* path_to_crypt, char* path_to_decrypt);
void main(int argc, char* argv[])
{
    argv[1] = "c:/2/key.txt";
    argv[2] = "c:/2/msg.txt";
    argv[3] = "c:/2/output.txt";
    argv[4] = "c:/2/decrypt.txt";
    char my_keys[8][32] = {0};
    char crypt_block[64] = {0};
    char decrypt_block[64] = {0};
    int file_size;
    int block_number;
    int block_nm = 0; // for main_step_crypt
    float my_crypt_block[8] = {0};
    get_file_size(&file_size, argv[2]);
    char* my_msg = new char[file_size];
    char* output = new char[file_size];
    char L[32] = {0}, R[32] = {0};
    ofstream out(argv[3], ios::binary);
    get_keys(my_keys, argv[1]);
    char_to_dec(my_keys, 0, 0, 0, 0);
    get_open_code(my_msg, argv[2]);
    block_number = (file_size * 8) / 64;
    char** blocks = new char*[block_number];
    for(int i = 0; i < block_number; i++)
    {
        blocks[i] = new char[8];
    }
    get_blocks(blocks, my_msg, file_size);
    for(int i = 0; i < block_number; i++)
    {
        get_L_R(L, R, blocks, i);
        for(int j = 0; j < 3; j++)
        {
            for(int k = 0; k < 8; k++)
            {
                main_step_crypt(my_keys, L, R, k);    
            }
        }
            for(int t = 7; t >= 0; t--)
            {
                main_step_crypt(my_keys, L, R, t);    
            }

            get_crypt_block(R, L, crypt_block);
            dec_to_char(crypt_block, my_crypt_block);
            for(int p = 0; p < 8; p++)
            {
            output[p] = (char)my_crypt_block[p];
            }
            for(int t = 0; t < 8; t++)
            my_crypt_block[t] = 0;
            out.write(output, 8);
    }    
    out.close();
    delete[] output;
    for(int i = 0; i < block_number; i++)
    {
        delete[] blocks[i];
    }
    delete[] blocks;
      decrypt(my_keys, file_size, argv[3], argv[4]); //!!!!!!!!!!!!!!!!!!!!!!!
}

void get_keys(char arr[8][32], char* ar)
{
    int let;
    int key_number = 0, n = 0, k = 0;
    char keys[33];
    ifstream key(ar, ios::binary);
    if(key.good())
        cout << "read key_file success" << endl;
    else
        cout << "read key_file error" << endl;

    while(!key.eof())
    {
        let = key.get();
        keys[n] = let;
        n++;
    }
    
    for(int i = 0; i < 32; i++)
    {
        if((i % 4) == 0 && i)
        {
            key_number++;
            k = 0;
        }
        arr[key_number][k] = keys[i];
        k++;
    }
}

void get_open_code(char* mess, char* ar)
{
    int n = 0;
    ifstream msg(ar, ios::binary);
    if(msg.good())
        cout << "read file success" << endl;
    else
        cout << "read file error" << endl;
    while(!msg.eof())
    {
        mess[n] = msg.get();
        n++;
    }
}

void get_file_size(int* fs, char* ar)
{
    ifstream msg(ar, ios::binary);
    msg.seekg(0, ios::end);
    *fs = msg.tellg();
    msg.seekg(0, ios::beg);
    msg.close();
}

void get_blocks(char** bs, char* msg, int fs)
{
    int block_number = 0, k = 0;
    for(int i = 0; i < fs; i++)
    {
        if((i % 8) == 0 && i)
        {
            k = 0;
            block_number++;
        }
        bs[block_number][k] = msg[i];
        k++;
    }
}

void main_step_crypt(char k[8][32], char* L, char* R, int key_n)
{
    int rr = 0, row = 0, smodh_s = 0, newR_s = 0;
    char smod[32];
    char ssimple[32] = {0};
    char sxor[32] = {0};
    char newL[32] = {0}, newR[32] = {0};
    char change_table[8][16] = 
    {
      5, 9, 2, 4, 8, 7, 3, 10, 15, 1, 13, 11, 6, 14, 0, 12,
      7, 12, 5, 13, 2, 14, 4, 3, 0, 8, 10, 9, 1, 6, 11, 15,
      10, 9, 11, 4, 12, 5, 13, 1, 14, 3, 7, 15, 8, 6, 0, 2,
      15, 8, 4, 0, 6, 14, 13, 3, 12, 11, 2, 1, 7, 5, 9, 10,
      8, 10, 11, 6, 9, 12, 4, 13, 7, 1, 14, 3, 5, 0, 2, 15,
      15, 1, 14, 0, 5, 8, 2, 13, 7, 12, 9, 11, 10, 3, 6, 4,
      10, 7, 6, 11, 12, 4, 1, 13, 14, 9, 8, 0, 2, 5, 15, 3,
      10, 7, 6, 11, 12, 4, 1, 13, 14, 9, 8, 0, 2, 5, 15, 3,
    };
    
    for(int i = 31; i >= 0; i--)
    {
            smod[i] = (R[i] & k[key_n][i]);
    }

    empty_change(smod, change_table, ssimple);
    char_to_dec(NULL, 1, ssimple, 4, 8);
    ciclic_shift(ssimple);
    my_xor(L, ssimple);

    for(int i = 0; i < 32; i++)
    {
        newR[i] = L[i];
        newL[i] = ssimple[i];
    }
    
    for(int i = 0; i < 32; i++)
    {
        R[i] = newR[i];
        L[i] = newL[i];
    }
}

void char_to_dec(char a[8][32], int f, char* ah, int bits_num, int byts_num)
{
    
    char buff[8] = {0};
    char tmp[8][32] = {0};
    int nulls = 0, now_pos = 0, nullss;
    int tmp_s = 0;
    char* buff2 = new char[bits_num + 1];
    char tmp2[32] = {0};
    int s = 0, nulls2 = 0, nullss2;

    if(!f)
    {
        for(int i = 0; i < 8; i++)
        {        
            for(int k = 0; k < 4; k++)
            {
                itoa(a[i][k], buff, 2);
                for(int z = 0; z < 8; z++)
                {
                    if(buff[z] == 0)
                    {
                        nulls++;
                    }
                }
                nullss = nulls;
                if(nulls)
                {
                    while(nulls)
                    {
                        tmp[i][tmp_s] = '0';
                        tmp_s++;
                        nulls--;
                    }
                }
                for(int p = 0; p < 8 - nullss; p++)
                {
                    tmp[i][tmp_s] = buff[p];
                    tmp_s++;
                }
            }    
                    tmp_s = 0;
        }

            for(int i = 0; i < 8; i++)
            {
                for(int j = 0; j < 32; j++)
                {
                    a[i][j] = tmp[i][j];
                }
            }
    }

    if(f)
    {        
        for(int i = 0; i < byts_num; i++)
        {
            memset(buff2, 0, bits_num);
            itoa(ah[i], buff2, 2);
            for(int z = 0; z < bits_num; z++)
            {
                if(buff2[z] != '1' && buff2[z] != '0')
                {
                    nulls2++;
                }
            }
            nullss2 = nulls2;
            if(nulls2)
            {
                while(nulls2)
                {
                    tmp2[s] = '0';
                    s++;
                    nulls2--;
                }
            }            
            for(int t = 0; t < (bits_num - nullss2); t++)
            {
                if(s < 32)
                {
                tmp2[s] = buff2[t];
                s++;
                }
            }
            
        }
        for(int i = 0; i < 32; i++)
        {
            ah[i] = tmp2[i];
        }        
    }
    delete[] buff2;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

void empty_change(char* sm, char table[8][16], char* ssmpl)
{
    float tmp[8] = {0};
    int k = 3, i = 0;
        for(int t = 0; t < 32; t++)
        {
            if(sm[t] == '1')
            {
                tmp[i] += pow(2.0, k);
            }
            k--;       
            if(k == (-1))
            {
                k = 3;
                i++;
            }
            
        }
    
    for(int i = 0; i < 8; i++)
    {
        ssmpl[i] = (char)table[i][(int)tmp[i]];
    }

}

void ciclic_shift(char* arr)
{
    char shift[11], ost[21];
    int k = 11, shift_s = 0;;
    for(int i = 0; i < 11; i++)
    {
        shift[i] = arr[i];
    }
    for(int i = 0; i < 21; i++)
    {
        ost[i] = arr[k];
        k++;
    }
    for(int i = 0; i < 32; i++)
    {
        if(i > 20)
        {
            arr[i] = shift[shift_s];
            shift_s++;
        }
        else
        {
            arr[i] = ost[i];
        }
    }
}

void my_xor(char* l, char* sxor)
{
    for(int i = 0; i < 32; i++)
    {
        if((l[i] == '0' && sxor[i] == '0') || (l[i] == '1' && sxor[i] == '1'))
        {
            sxor[i] = '0';
        }
        else
        {
        sxor[i] = '1';
        }
    }
}

void dec_to_char(char* arr, float *out)
{
    int k = 7, i = 0;
    
        for(int t = 0; t < 64; t++)
        {
            if(arr[t] == '1')
                out[i] += pow(2.0, k);
            k--;
            if(k == -1)
            {
                k = 7;
                i++;
            }    
        }
}

void get_L_R(char* l, char* r, char** bs, int block_n)
{
    int rr = 0;
        for(int i = 0; i < 8; i++)
        {
            if(i > 3)
            {
            r[rr] = bs[block_n][i];
            rr++;
            }
            else
            {
            l[i] = bs[block_n][i];
            }
        }
    [color=red]char_to_dec(NULL, 1, r, 8, 4);[/color]
    char_to_dec(NULL, 1, l, 8, 4);
}

void get_crypt_block(char* r, char* l, char* cr_block)
{
    int newR_s = 0;
    for(int i = 0; i < 64; i++)
    {
        if(i > 31)
        {
            cr_block[i] = r[newR_s];
            newR_s++;
        }
        else
        {
            cr_block[i] = l[i];
        }
    }
}

void decrypt(char k[8][32], int fs, char* path_to_crypt, char* path_to_decrypt)
{
    int block_number, n = 0;
    char L[32] = {0}, R[32] = {0};
    char crypt_block[64] = {0};
    char* crypt_msg = new char[fs];
    char* output = new char[fs];
    float my_crypt_block[8] = {0};
    ifstream msg(path_to_crypt, ios::binary);
    if(msg.good())
        cout << "read file success" << endl;
    else
        cout << "read file error" << endl;
    while(!msg.eof())
    {
        crypt_msg[n] = msg.get();
        n++;
    }
    ofstream decrypt(path_to_decrypt, ios::binary);
    block_number = (fs * 8) / 64;
    char** blocks = new char*[block_number];
    for(int i = 0; i < block_number; i++)
    {
        blocks[i] = new char[8];
    }
    get_blocks(blocks, crypt_msg, fs);
    for(int i = 0; i < block_number; i++)
    {
        get_L_R(L, R, blocks, 0);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        for(int t = 0; t < 7; t++)
        {
            main_step_crypt(k, L, R, t);    
        }
        for(int j = 0; j < 3; j++)
        {
            for(int a = 7; a >= 0; a--)
            {
                    main_step_crypt(k, L, R, a);    
            }
        }
        get_crypt_block(R, L, crypt_block);
        dec_to_char(crypt_block, my_crypt_block);

        for(int p = 0; p < 8; p++)
        {
        output[p] = (char)my_crypt_block[p];
        }
        for(int t = 0; t < 8; t++)
        {
        my_crypt_block[t] = 0;
        }
        decrypt.write(output, 8);    
    }
    decrypt.close();
    delete[] output;
    delete[] crypt_msg;
    for(int i = 0; i < block_number; i++)
    {
        delete[] blocks[i];
    }
    delete[] blocks;
}


При вызове функции char_to_dec(), при попытке освобождения, выделенной памяти(delete[] buff2) вылетает ошибка "This may be due to a corruption of the heap, which indicates a bug in Gost.exe or any of the DLLs it has loaded. и т.д" Причем, если из maina эта функция вызывается без ошибок, то из функции decrypt() данная ошибка появляется.
Отметил //!!!!!!!!!!!!! где вылетает ошибка. Что-то не выделяется текст в тэгах коде /коде
PM MAIL   Вверх
sQu1rr
Дата 18.11.2010, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Эх... посмотрел я ваш код  smile 

Боже упаси так писать

Наченем с int main() по стандарту
Если массив не одномерный, то определяем { { 0, 0 } } по стандарту опять же
Обращаем внимание на то что компилятор указывает на изобилие неиспользуемых переменных чуть ли не в каждой функции

Вообщем, если можно, выложите нерабочий участок кода, проверьте, будет ли heap corruption если тело char_to_dec закоментировать и пусть она возвращает одно и тоже, если
и при этом будет ошибка, не в ней дело, если исчезнет, то скорее всего внутри этой функции - выход за пределы массива

 smile  Код жесть на самом деле smile Но ладно, попробуйте пока сами разобраться smile

Добавлено через 11 минут и 39 секунд
Можете попробовать использовать вместо itoa _itoa_s или как там его - который безопасный.
В данный момент на линухе без окон и не могу проверить работу программы, не переписываю функции ( так лень  smile )

Это сообщение отредактировал(а) sQu1rr - 18.11.2010, 21:08
PM MAIL Skype GTalk   Вверх
sQu1rr
Дата 18.11.2010, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



И да еще вопрос
Ничего что ты передаешь в функцию decrypt ( argv[3], argv[4] ) ?

Если честно - меня убило smile
Код

argv[1] = "c:/2/key.txt";
argv[2] = "c:/2/msg.txt";
argv[3] = "c:/2/output.txt";
argv[4] = "c:/2/decrypt.txt";


Скорее отсюда и ошибка
Создай сначало массив - argv -для ВХОДНЫХ параметров, зачем его изменять?
И да...
Не поленился проверил char_to_dec
Выходна за предел массива нет, ошибка не оттуда.
Уверен, что это argv. И все же, даже если взодные данные есть. ЗАЧЕМ ИХ МЕНЯТЬ?  smile 
PM MAIL Skype GTalk   Вверх
awesome
Дата 18.11.2010, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



sQu1rr, спасибо за помощь и советы! argv создал, как надо. Но эта функция все рано выдает ошибку.
Код

void char_to_dec(char* ah, int bits_num, int byts_num)
{
    char* buff2 = new char[bits_num];
    char tmp2[32] = {0};
    int s = 0, nulls2 = 0, nullss2;

        for(int i = 0; i < byts_num; i++)
        {
            memset(buff2, 0, bits_num);
            itoa(ah[i], buff2, 2);
            for(int z = 0; z < bits_num; z++)
            {
                if(buff2[z] != '1' && buff2[z] != '0')
                {
                    nulls2++;
                }
            }
            nullss2 = nulls2;
            if(nulls2)
            {
                while(nulls2)
                {
                    tmp2[s] = '0';
                    s++;
                    nulls2--;
                }
            }            
            for(int t = 0; t < (bits_num - nullss2); t++)
            {
                if(s < 32)
                {
                tmp2[s] = buff2[t];
                s++;
                }
            }
            
        }
        for(int i = 0; i < 32; i++)
        {
            ah[i] = tmp2[i];
        }        
      delete[] buff2;
}
 
при delete[] buff2 вылетает "heap corruption detected: after normal block(#153)...."
PM MAIL   Вверх
Леопольд
Дата 18.11.2010, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



awesome, если что, можно делать так:
Код
void char_to_dec(char* ah, int bits_num, int byts_num)
{
    char buff2 [bits_num];
    //...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
sQu1rr
Дата 18.11.2010, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Леопольд @  18.11.2010,  23:30 Найти цитируемый пост)
awesome, если что, можно делать так:

Разьве можно?  smile 
PM MAIL Skype GTalk   Вверх
awesome
Дата 18.11.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Леопольд, студия говорит, что нельзя...
PM MAIL   Вверх
Леопольд
Дата 18.11.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(awesome @  18.11.2010,  22:51 Найти цитируемый пост)
itoa(ah[i], buff2, 2);
h[i] неявно преоbразуется в int, т.е., если ah[i] == '0' то itoa запишет в bуфер десятичное число 48 (если это ANSI) в двоичном представлении.
А ещё, itoa не входит в стандарт языка. 

Это сообщение отредактировал(а) Леопольд - 18.11.2010, 23:39


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
sQu1rr
Дата 18.11.2010, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Леопольд @  18.11.2010,  23:37 Найти цитируемый пост)
А ещё, itoa не входит в стандарт языка. 


ТС работает в VC smile Ктому же это ошибка алгоритма, а нас просят найти косяк в управлении памятью  smile

Добавлено @ 23:43
Эх, а ошибка и правду в этой функции кроеться smile

Код

read key_file success
itoa overflow: 6
itoa overflow: 6
Name: tmp[8x8]; => 0->8
Name: tmp[8x8]; => 0->9
Name: tmp[8x8]; => 0->10
Name: tmp[8x8]; => 0->11
Name: tmp[8x8]; => 0->12
Name: tmp[8x8]; => 0->13
Name: tmp[8x8]; => 0->14
Name: tmp[8x8]; => 0->15
itoa overflow: 6
Name: tmp[8x8]; => 0->16
Name: tmp[8x8]; => 0->17
Name: tmp[8x8]; => 0->18
Name: tmp[8x8]; => 0->19
Name: tmp[8x8]; => 0->20
Name: tmp[8x8]; => 0->21
Name: tmp[8x8]; => 0->22
Name: tmp[8x8]; => 0->23
itoa overflow: 6
Name: tmp[8x8]; => 0->24
Name: tmp[8x8]; => 0->25
Name: tmp[8x8]; => 0->26
Name: tmp[8x8]; => 0->27
Name: tmp[8x8]; => 0->28
Name: tmp[8x8]; => 0->29
Name: tmp[8x8]; => 0->30
Name: tmp[8x8]; => 0->31
itoa overflow: 6
itoa overflow: 4
Name: tmp[8x8]; => 1->8
Name: tmp[8x8]; => 1->9
Name: tmp[8x8]; => 1->10
Name: tmp[8x8]; => 1->11
Name: tmp[8x8]; => 1->12
Name: tmp[8x8]; => 1->13
Name: tmp[8x8]; => 1->14
Name: tmp[8x8]; => 1->15
itoa overflow: 2
Name: tmp[8x8]; => 1->16
Name: tmp[8x8]; => 1->17
Name: tmp[8x8]; => 1->18
Name: tmp[8x8]; => 1->19
Name: tmp[8x8]; => 1->20
Name: tmp[8x8]; => 1->21
Name: tmp[8x8]; => 1->22
Name: tmp[8x8]; => 1->23
itoa overflow: 1
Name: tmp[8x8]; => 1->24
Name: tmp[8x8]; => 1->25
Name: tmp[8x8]; => 1->26
Name: tmp[8x8]; => 1->27
Name: tmp[8x8]; => 1->28
Name: tmp[8x8]; => 1->29
Name: tmp[8x8]; => 1->30
Name: tmp[8x8]; => 1->31
itoa overflow: 7
itoa overflow: 7
Name: tmp[8x8]; => 2->8
Name: tmp[8x8]; => 2->9
Name: tmp[8x8]; => 2->10
Name: tmp[8x8]; => 2->11
Name: tmp[8x8]; => 2->12
Name: tmp[8x8]; => 2->13
Name: tmp[8x8]; => 2->14
Name: tmp[8x8]; => 2->15
itoa overflow: 7
Name: tmp[8x8]; => 2->16
Name: tmp[8x8]; => 2->17
Name: tmp[8x8]; => 2->18
Name: tmp[8x8]; => 2->19
Name: tmp[8x8]; => 2->20
Name: tmp[8x8]; => 2->21
Name: tmp[8x8]; => 2->22
Name: tmp[8x8]; => 2->23
itoa overflow: 6
Name: tmp[8x8]; => 2->24
Name: tmp[8x8]; => 2->25
Name: tmp[8x8]; => 2->26
Name: tmp[8x8]; => 2->27
Name: tmp[8x8]; => 2->28
Name: tmp[8x8]; => 2->29
Name: tmp[8x8]; => 2->30
Name: tmp[8x8]; => 2->31
itoa overflow: 6
itoa overflow: 1
Name: tmp[8x8]; => 3->8
Name: tmp[8x8]; => 3->9
Name: tmp[8x8]; => 3->10
Name: tmp[8x8]; => 3->11
Name: tmp[8x8]; => 3->12
Name: tmp[8x8]; => 3->13
Name: tmp[8x8]; => 3->14
Name: tmp[8x8]; => 3->15
itoa overflow: 1
Name: tmp[8x8]; => 3->16
Name: tmp[8x8]; => 3->17
Name: tmp[8x8]; => 3->18
Name: tmp[8x8]; => 3->19
Name: tmp[8x8]; => 3->20
Name: tmp[8x8]; => 3->21
Name: tmp[8x8]; => 3->22
Name: tmp[8x8]; => 3->23
itoa overflow: 1
Name: tmp[8x8]; => 3->24
Name: tmp[8x8]; => 3->25
Name: tmp[8x8]; => 3->26
Name: tmp[8x8]; => 3->27
Name: tmp[8x8]; => 3->28
Name: tmp[8x8]; => 3->29
Name: tmp[8x8]; => 3->30
Name: tmp[8x8]; => 3->31
itoa overflow: 8
itoa overflow: 8
Name: tmp[8x8]; => 4->8
Name: tmp[8x8]; => 4->9
Name: tmp[8x8]; => 4->10
Name: tmp[8x8]; => 4->11
Name: tmp[8x8]; => 4->12
Name: tmp[8x8]; => 4->13
Name: tmp[8x8]; => 4->14
Name: tmp[8x8]; => 4->15
itoa overflow: 7
Name: tmp[8x8]; => 4->16
Name: tmp[8x8]; => 4->17
Name: tmp[8x8]; => 4->18
Name: tmp[8x8]; => 4->19
Name: tmp[8x8]; => 4->20
Name: tmp[8x8]; => 4->21
Name: tmp[8x8]; => 4->22
Name: tmp[8x8]; => 4->23
itoa overflow: 4
Name: tmp[8x8]; => 4->24
Name: tmp[8x8]; => 4->25
Name: tmp[8x8]; => 4->26
Name: tmp[8x8]; => 4->27
Name: tmp[8x8]; => 4->28
Name: tmp[8x8]; => 4->29
Name: tmp[8x8]; => 4->30
Name: tmp[8x8]; => 4->31
itoa overflow: 2
itoa overflow: 7
Name: tmp[8x8]; => 5->8
Name: tmp[8x8]; => 5->9
Name: tmp[8x8]; => 5->10
Name: tmp[8x8]; => 5->11
Name: tmp[8x8]; => 5->12
Name: tmp[8x8]; => 5->13
Name: tmp[8x8]; => 5->14
Name: tmp[8x8]; => 5->15
itoa overflow: 1
Name: tmp[8x8]; => 5->16
Name: tmp[8x8]; => 5->17
Name: tmp[8x8]; => 5->18
Name: tmp[8x8]; => 5->19
Name: tmp[8x8]; => 5->20
Name: tmp[8x8]; => 5->21
Name: tmp[8x8]; => 5->22
Name: tmp[8x8]; => 5->23
itoa overflow: 1
Name: tmp[8x8]; => 5->24
Name: tmp[8x8]; => 5->25
Name: tmp[8x8]; => 5->26
Name: tmp[8x8]; => 5->27
Name: tmp[8x8]; => 5->28
Name: tmp[8x8]; => 5->29
Name: tmp[8x8]; => 5->30
Name: tmp[8x8]; => 5->31
itoa overflow: 6
itoa overflow: 1
Name: tmp[8x8]; => 6->8
Name: tmp[8x8]; => 6->9
Name: tmp[8x8]; => 6->10
Name: tmp[8x8]; => 6->11
Name: tmp[8x8]; => 6->12
Name: tmp[8x8]; => 6->13
Name: tmp[8x8]; => 6->14
Name: tmp[8x8]; => 6->15
itoa overflow: 6
Name: tmp[8x8]; => 6->16
Name: tmp[8x8]; => 6->17
Name: tmp[8x8]; => 6->18
Name: tmp[8x8]; => 6->19
Name: tmp[8x8]; => 6->20
Name: tmp[8x8]; => 6->21
Name: tmp[8x8]; => 6->22
Name: tmp[8x8]; => 6->23
itoa overflow: 1
Name: tmp[8x8]; => 6->24
Name: tmp[8x8]; => 6->25
Name: tmp[8x8]; => 6->26
Name: tmp[8x8]; => 6->27
Name: tmp[8x8]; => 6->28
Name: tmp[8x8]; => 6->29
Name: tmp[8x8]; => 6->30
Name: tmp[8x8]; => 6->31
itoa overflow: 3
itoa overflow: 1
Name: tmp[8x8]; => 7->8
Name: tmp[8x8]; => 7->9
Name: tmp[8x8]; => 7->10
Name: tmp[8x8]; => 7->11
Name: tmp[8x8]; => 7->12
Name: tmp[8x8]; => 7->13
Name: tmp[8x8]; => 7->14
Name: tmp[8x8]; => 7->15
itoa overflow: 1
Name: tmp[8x8]; => 7->16
Name: tmp[8x8]; => 7->17
Name: tmp[8x8]; => 7->18
Name: tmp[8x8]; => 7->19
Name: tmp[8x8]; => 7->20
Name: tmp[8x8]; => 7->21
Name: tmp[8x8]; => 7->22
Name: tmp[8x8]; => 7->23
itoa overflow: 1
Name: tmp[8x8]; => 7->24
Name: tmp[8x8]; => 7->25
Name: tmp[8x8]; => 7->26
Name: tmp[8x8]; => 7->27
Name: tmp[8x8]; => 7->28
Name: tmp[8x8]; => 7->29
Name: tmp[8x8]; => 7->30
Name: tmp[8x8]; => 7->31
Name: tmp[8x8]; => 0->8
Name: tmp[8x8]; => 0->9
Name: tmp[8x8]; => 0->10
Name: tmp[8x8]; => 0->11
Name: tmp[8x8]; => 0->12
Name: tmp[8x8]; => 0->13
Name: tmp[8x8]; => 0->14
Name: tmp[8x8]; => 0->15
Name: tmp[8x8]; => 0->16
Name: tmp[8x8]; => 0->17
Name: tmp[8x8]; => 0->18
Name: tmp[8x8]; => 0->19
Name: tmp[8x8]; => 0->20
Name: tmp[8x8]; => 0->21
Name: tmp[8x8]; => 0->22
Name: tmp[8x8]; => 0->23
Name: tmp[8x8]; => 0->24
Name: tmp[8x8]; => 0->25
Name: tmp[8x8]; => 0->26
Name: tmp[8x8]; => 0->27
Name: tmp[8x8]; => 0->28
Name: tmp[8x8]; => 0->29
Name: tmp[8x8]; => 0->30
Name: tmp[8x8]; => 0->31
Name: tmp[8x8]; => 1->8
Name: tmp[8x8]; => 1->9
Name: tmp[8x8]; => 1->10
Name: tmp[8x8]; => 1->11
Name: tmp[8x8]; => 1->12
Name: tmp[8x8]; => 1->13
Name: tmp[8x8]; => 1->14
Name: tmp[8x8]; => 1->15
Name: tmp[8x8]; => 1->16
Name: tmp[8x8]; => 1->17
Name: tmp[8x8]; => 1->18
Name: tmp[8x8]; => 1->19
Name: tmp[8x8]; => 1->20
Name: tmp[8x8]; => 1->21
Name: tmp[8x8]; => 1->22
Name: tmp[8x8]; => 1->23
Name: tmp[8x8]; => 1->24
Name: tmp[8x8]; => 1->25
Name: tmp[8x8]; => 1->26
Name: tmp[8x8]; => 1->27
Name: tmp[8x8]; => 1->28
Name: tmp[8x8]; => 1->29
Name: tmp[8x8]; => 1->30
Name: tmp[8x8]; => 1->31
Name: tmp[8x8]; => 2->8
Name: tmp[8x8]; => 2->9
Name: tmp[8x8]; => 2->10
Name: tmp[8x8]; => 2->11
Name: tmp[8x8]; => 2->12
Name: tmp[8x8]; => 2->13
Name: tmp[8x8]; => 2->14
Name: tmp[8x8]; => 2->15
Name: tmp[8x8]; => 2->16
Name: tmp[8x8]; => 2->17
Name: tmp[8x8]; => 2->18
Name: tmp[8x8]; => 2->19
Name: tmp[8x8]; => 2->20
Name: tmp[8x8]; => 2->21
Name: tmp[8x8]; => 2->22
Name: tmp[8x8]; => 2->23
Name: tmp[8x8]; => 2->24
Name: tmp[8x8]; => 2->25
Name: tmp[8x8]; => 2->26
Name: tmp[8x8]; => 2->27
Name: tmp[8x8]; => 2->28
Name: tmp[8x8]; => 2->29
Name: tmp[8x8]; => 2->30
Name: tmp[8x8]; => 2->31
Name: tmp[8x8]; => 3->8
Name: tmp[8x8]; => 3->9
Name: tmp[8x8]; => 3->10
Name: tmp[8x8]; => 3->11
Name: tmp[8x8]; => 3->12
Name: tmp[8x8]; => 3->13
Name: tmp[8x8]; => 3->14
Name: tmp[8x8]; => 3->15
Name: tmp[8x8]; => 3->16
Name: tmp[8x8]; => 3->17
Name: tmp[8x8]; => 3->18
Name: tmp[8x8]; => 3->19
Name: tmp[8x8]; => 3->20
Name: tmp[8x8]; => 3->21
Name: tmp[8x8]; => 3->22
Name: tmp[8x8]; => 3->23
Name: tmp[8x8]; => 3->24
Name: tmp[8x8]; => 3->25
Name: tmp[8x8]; => 3->26
Name: tmp[8x8]; => 3->27
Name: tmp[8x8]; => 3->28
Name: tmp[8x8]; => 3->29
Name: tmp[8x8]; => 3->30
Name: tmp[8x8]; => 3->31
Name: tmp[8x8]; => 4->8
Name: tmp[8x8]; => 4->9
Name: tmp[8x8]; => 4->10
Name: tmp[8x8]; => 4->11
Name: tmp[8x8]; => 4->12
Name: tmp[8x8]; => 4->13
Name: tmp[8x8]; => 4->14
Name: tmp[8x8]; => 4->15
Name: tmp[8x8]; => 4->16
Name: tmp[8x8]; => 4->17
Name: tmp[8x8]; => 4->18
Name: tmp[8x8]; => 4->19
Name: tmp[8x8]; => 4->20
Name: tmp[8x8]; => 4->21
Name: tmp[8x8]; => 4->22
Name: tmp[8x8]; => 4->23
Name: tmp[8x8]; => 4->24
Name: tmp[8x8]; => 4->25
Name: tmp[8x8]; => 4->26
Name: tmp[8x8]; => 4->27
Name: tmp[8x8]; => 4->28
Name: tmp[8x8]; => 4->29
Name: tmp[8x8]; => 4->30
Name: tmp[8x8]; => 4->31
Name: tmp[8x8]; => 5->8
Name: tmp[8x8]; => 5->9
Name: tmp[8x8]; => 5->10
Name: tmp[8x8]; => 5->11
Name: tmp[8x8]; => 5->12
Name: tmp[8x8]; => 5->13
Name: tmp[8x8]; => 5->14
Name: tmp[8x8]; => 5->15
Name: tmp[8x8]; => 5->16
Name: tmp[8x8]; => 5->17
Name: tmp[8x8]; => 5->18
Name: tmp[8x8]; => 5->19
Name: tmp[8x8]; => 5->20
Name: tmp[8x8]; => 5->21
Name: tmp[8x8]; => 5->22
Name: tmp[8x8]; => 5->23
Name: tmp[8x8]; => 5->24
Name: tmp[8x8]; => 5->25
Name: tmp[8x8]; => 5->26
Name: tmp[8x8]; => 5->27
Name: tmp[8x8]; => 5->28
Name: tmp[8x8]; => 5->29
Name: tmp[8x8]; => 5->30
Name: tmp[8x8]; => 5->31
Name: tmp[8x8]; => 6->8
Name: tmp[8x8]; => 6->9
Name: tmp[8x8]; => 6->10
Name: tmp[8x8]; => 6->11
Name: tmp[8x8]; => 6->12
Name: tmp[8x8]; => 6->13
Name: tmp[8x8]; => 6->14
Name: tmp[8x8]; => 6->15
Name: tmp[8x8]; => 6->16
Name: tmp[8x8]; => 6->17
Name: tmp[8x8]; => 6->18
Name: tmp[8x8]; => 6->19
Name: tmp[8x8]; => 6->20
Name: tmp[8x8]; => 6->21
Name: tmp[8x8]; => 6->22
Name: tmp[8x8]; => 6->23
Name: tmp[8x8]; => 6->24
Name: tmp[8x8]; => 6->25
Name: tmp[8x8]; => 6->26
Name: tmp[8x8]; => 6->27
Name: tmp[8x8]; => 6->28
Name: tmp[8x8]; => 6->29
Name: tmp[8x8]; => 6->30
Name: tmp[8x8]; => 6->31
Name: tmp[8x8]; => 7->8
Name: tmp[8x8]; => 7->9
Name: tmp[8x8]; => 7->10
Name: tmp[8x8]; => 7->11
Name: tmp[8x8]; => 7->12
Name: tmp[8x8]; => 7->13
Name: tmp[8x8]; => 7->14
Name: tmp[8x8]; => 7->15
Name: tmp[8x8]; => 7->16
Name: tmp[8x8]; => 7->17
Name: tmp[8x8]; => 7->18
Name: tmp[8x8]; => 7->19
Name: tmp[8x8]; => 7->20
Name: tmp[8x8]; => 7->21
Name: tmp[8x8]; => 7->22
Name: tmp[8x8]; => 7->23
Name: tmp[8x8]; => 7->24
Name: tmp[8x8]; => 7->25
Name: tmp[8x8]; => 7->26
Name: tmp[8x8]; => 7->27
Name: tmp[8x8]; => 7->28
Name: tmp[8x8]; => 7->29
Name: tmp[8x8]; => 7->30
Name: tmp[8x8]; => 7->31
read file success
read file success

Это лог, выводиться каждое неверное обращение к массиву в функции char_to_dec
Найди ошибку сам smile С переменной помог ;)
формат Name: [переменная][size_x][size_y]; => x->y

Это сообщение отредактировал(а) sQu1rr - 18.11.2010, 23:46
PM MAIL Skype GTalk   Вверх
Леопольд
Дата 18.11.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(sQu1rr @  18.11.2010,  23:32 Найти цитируемый пост)
Разьве можно?

точно знаю, что можно так (g++ не треbует константы):
Код
#include <iostream>

void foo(unsigned num)
{
    unsigned const len = num;
    char str[len];

    std::cout << sizeof(str) << std::endl;
}

int main()
{
    foo(2);
    foo(32);

    return 0;
}

http://liveworkspace.org/code/daa83accd5a9...a8e9e7c50960bd9


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
sQu1rr
Дата 18.11.2010, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(Леопольд @  18.11.2010,  23:45 Найти цитируемый пост)
точно знаю, что можно так (g++ не треbует константы):


Буду знать, спасибо ;)
Но как видно - проблема не в delete

Добавлено через 3 минуты и 26 секунд
Выход за границы - вот тут
Код

char_to_dec(my_keys, 0, 0, 0, 0);

Это в main()
PM MAIL Skype GTalk   Вверх
Леопольд
Дата 18.11.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(sQu1rr @  18.11.2010,  23:47 Найти цитируемый пост)
Буду знать
Главное помнить, то массив bудет на стеке а не в куче...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
awesome
Дата 18.11.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(sQu1rr @  18.11.2010,  23:47 Найти цитируемый пост)
Добавлено через 3 минуты и 26 секунд
Выход за границы - вот тут
код C++
1:
char_to_dec(my_keys, 0, 0, 0, 0);

Это в main() 


я эту функцию убрал. теперь функция char_to_dec выглядит, как 
Код

void char_to_dec(char* ah, int bits_num, int byts_num)
{
    char buff2 [bits_num];
    char tmp2[32] = {0};
    int s = 0, nulls2 = 0, nullss2;

        for(int i = 0; i < byts_num; i++)
        {
            memset(buff2, 0, bits_num);
            itoa(ah[i], buff2, 2);
            for(int z = 0; z < bits_num; z++)
            {
                if(buff2[z] != '1' && buff2[z] != '0')
                {
                    nulls2++;
                }
            }
            nullss2 = nulls2;
            if(nulls2)
            {
                while(nulls2)
                {
                    tmp2[s] = '0';
                    s++;
                    nulls2--;
                }
            }            
            for(int t = 0; t < (bits_num - nullss2); t++)
            {
                if(s < 32)
                {
                tmp2[s] = buff2[t];
                s++;
                }
            }
            
        }
        for(int i = 0; i < 32; i++)
        {
            ah[i] = tmp2[i];
        }

      delete[] buff2;
}

ошибка вылетает именно на строчке delete[] buff2;


Цитата(Леопольд @  18.11.2010,  23:37 Найти цитируемый пост)
h[i] неявно преоbразуется в int, т.е., если ah[i] == '0' то itoa запишет в bуфер десятичное число 48 (если это ANSI) в двоичном представлении.

мне это и нужно=)

PM MAIL   Вверх
sQu1rr
Дата 19.11.2010, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(awesome @  18.11.2010,  23:57 Найти цитируемый пост)
ошибка вылетает именно на строчке delete[] buff2;

Не потому что с ней чтото невпорядке, а потому что случилось чтото до этого... например, как я говорил, выход за массив, осталось только определить где...
Это же С++, почему не используешь нормальные векторы или лучше boost::array и boost::multi_array?

Вернусь к этой теме с утра smile

Это сообщение отредактировал(а) sQu1rr - 19.11.2010, 00:07
PM MAIL Skype GTalk   Вверх
awesome
Дата 19.11.2010, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(sQu1rr @  19.11.2010,  00:06 Найти цитируемый пост)
Это же С++, почему не используешь нормальные векторы или лучше boost::array и boost::multi_array?

не обладаю знаниями по этим вопросам. дали задание, пишу пока, как умею. в будущем, конечно, придется использовать более сложные конструкции.

Цитата(sQu1rr @  19.11.2010,  00:06 Найти цитируемый пост)
например, как я говорил, выход за массив, осталось только определить где...

ходил по дебагером, s вроде всегда от 0 до 31 - выхода за массив не наблюдается. завтра, значит, буду разбираться более детально.

sQu1rr, Леопольд,  спасибо за помощь!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.