Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Draiget
1 / 1 / 0
Регистрация: 02.05.2013
Сообщений: 31
Завершенные тесты: 2
#1

Отладка: _free_base “Error reading register value” - C++

24.09.2014, 23:12. Просмотров 1157. Ответов 25
Метки нет (Все метки)

Доброго времени суток, имеется сей код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
...
std::fstream f_hStream;
f_hStream.open("<file>", ios_base::binary | ios_base::in);
...
unsigned long size = 0;
...
f_hStream.read( reinterpret_cast< char* >( &size ), 8 );
 
if (size > 0){
    char buff[126];
    f_hStream.read(buff, size);
    string cut_header = zCrypto::from_base64( string(buff, size) );
 
    if ( cut_header.length() == 0 ) break;
                
    string dec = zCrypto::decrypt( cut_header ); //Ошибка тут <<<
    printf( "Header >> %s\n", dec.c_str() );
    vector<string> header = split(dec, ';');  //Ошибка тут <<<
 
    ...
                
} else {
    break;
}
...
Функция дешифровки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const char* zCrypto::decrypt(const std::string& str_in) {
    const string key = zCrypto::from_base64("<base_64line_here>");
    const string iv = zCrypto::from_base64("<base_64line_here>");
 
    std::string str_out;
    CryptoPP::CBC_Mode<CryptoPP::Rijndael>::Decryption decryption((byte*)key.c_str(), key.length(), (byte*)iv.c_str());
 
    CryptoPP::StringSource encryptor(str_in, true,
        new CryptoPP::StreamTransformationFilter(decryption,
            new CryptoPP::StringSink(str_out)
        )
    );
 
    return str_out.data();
}


Через дебаггер VS ошибку выдает на это, каждая ошибка скипаеться со 2-го раза:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __cdecl _free_base (void * pBlock)
{
 
        int retval = 0;
 
 
        if (pBlock == NULL)
            return;
 
        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
 
        retval = HeapFree(_crtheap, 0, pBlock);
        if (retval == 0)
        {
            errno = _get_errno_from_oserr(GetLastError());
        }
}
Отладка: _free_base “Error reading register value”
Если запускать без дебаггера, программа просто прекращает работу, подскажите куда копать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2014, 23:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отладка: _free_base “Error reading register value” (C++):

underflow error reading the file - C++
Программа вываливается с ошибкой: Вот код Как я понял, эта ошибка появляется когда слишком часто выполнятся функция f_read(), но...

Про спецификатор Register - C++
Решил испытать register. Есть 2 кода: #include &lt;iostream&gt; #include &lt;ctime&gt; int main() { time_t timer; ...

Ключевое слово register - C++
локальная переменная которая задается : register int a; так же будет локальной и сохраняется в регистр если есть свободное место. но...

Problems reading data - C++
Написал такой код: #include&lt;iostream&gt; #include&lt;vector&gt; using namespace std; int main(){ int xa,ya,xb,yb,ob; ...

Спецификатор автоматического класса памяти, register - C++
Прочитал: Register. Ещё один спецификатор автоматического класса памяти. Применяется к объектам, по умолчанию располагаемым в локальной...

Переменная в register, операция >>, во что компилится? - C++
Если объявлена переменная register unsigned int i=100; и затем мне надо выполнять операцию &gt;&gt;1 (деление на 2), в цикле, дак вот,...

25
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
25.09.2014, 18:16 #16
Цитата Сообщение от Draiget Посмотреть сообщение
delete &dec
Так нельзя делать. Это автоматический объект, он был создан на стеке, он сам освободить занятые ресурсы в деструкторе, после чего будет удален. Ошибка в том, что где то вызывается delete для объекта, который не был создал функцией new.
0
Draiget
1 / 1 / 0
Регистрация: 02.05.2013
Сообщений: 31
Завершенные тесты: 2
25.09.2014, 18:22  [ТС] #17
Цитата Сообщение от Toshkarik Посмотреть сообщение
Так нельзя делать.
А если так? Ошибка то все равно на delete идет, еще до } else {. Но меня больше интересует, почему она там вообще возникает.
C++
1
2
3
string * dec = new string();
...
delete dec;
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
25.09.2014, 18:25 #18
Я не смогу сказать без всего кода. Выложите его, будем разбираться. Как минимум, нужен весь блок
C++
1
2
3
if ( size > 0 ) {
   ...
}
0
Draiget
1 / 1 / 0
Регистрация: 02.05.2013
Сообщений: 31
Завершенные тесты: 2
25.09.2014, 18:32  [ТС] #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
if (size > 0){
    string buff(size, 0);
    f_hStream.read(&buff[0], buff.size());
 
    if ( buff.length() == 0 ) break;
                
    string * dec = new string();
    zCrypto::decrypt( *dec, buff );
    printf( "Header >> %s\n", (*dec).c_str() );
    vector<string> header = split(*dec, ';');
                
    //delete dec;
    unsigned long dataLen = atol(header[1].data());
    f_hStream.seekp(dataLen, ios_base::cur);
                
} else {
    break;
}
...
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
25.09.2014, 18:47 #20
Цитата Сообщение от Draiget Посмотреть сообщение
string buff(size, 0);
* * f_hStream.read(&buff[0], buff.size());
Вот так делать нельзя.

И вот это не имеет смысла:
C++
1
if ( buff.length() == 0 ) break;
C++
1
2
3
4
5
6
7
8
char buff[ size ] = { };
f_hStream.read( buff, size );
 
if ( f_hStream.gcount() == 0 ) break;
 
string dec;
 
zCrypto::decrypt( dec, string( buff ));
1
Draiget
1 / 1 / 0
Регистрация: 02.05.2013
Сообщений: 31
Завершенные тесты: 2
25.09.2014, 18:53  [ТС] #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
C++
1
char buff[ size ] = { };
IntelliSense: expression must have a constant value
А size это:

C++
1
2
3
4
5
int size = 0;
...
f_hStream.read( reinterpret_cast< char* >( &size ), 4 );
if (size > 0){
...
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
25.09.2014, 18:56 #22
Тогда вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
if ( size > 0 ) {
   ...
   char *buff = new char [ size ]();
   f_hStream.read( buff, size );
   
   if ( f_hStream.gcount() == 0 ) break;
 
   string dec;
 
   zCrypto::decrypt( dec, string( buff ));
   ...
   delete [] buff;
} else {
...
0
Draiget
1 / 1 / 0
Регистрация: 02.05.2013
Сообщений: 31
Завершенные тесты: 2
25.09.2014, 19:08  [ТС] #23
Цитата Сообщение от Toshkarik Посмотреть сообщение
Тогда вот так:
Ну, теперь снова 2 ошибки на zCrypto::decrypt( dec, string( buff ));, только уже разные.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void operator delete(
        void *pUserData
        )
{
        _CrtMemBlockHeader * pHead;
 
        RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
 
        if (pUserData == NULL)
            return;
 
        _mlock(_HEAP_LOCK);  /* block other threads */
        __TRY
 
            /* get a pointer to memory block header */
            pHead = pHdr(pUserData);
 
             /* verify block type */
            _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); // Ошибка тут <<<
 
            _free_dbg( pUserData, pHead->nBlockUse );
 
        __FINALLY
            _munlock(_HEAP_LOCK);  /* release other threads */
        __END_TRY_FINALLY
 
        return;
}
 
#endif  /* _DEBUG */
+
C++
1
2
3
4
5
6
7
8
9
10
11
12
extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
        const void * pUserData
        )
{
        if (!pUserData)
            return FALSE;
 
        if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
            return FALSE;
 
        return HeapValidate( _crtheap, 0, pHdr(pUserData) );
} // Ошибка тут <<<
0
Миниатюры
Отладка: _free_base “Error reading register value”   Отладка: _free_base “Error reading register value”  
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
25.09.2014, 19:15 #24
Вот здесь, как я понимаю, так:

C++
1
2
3
4
byte key[] =  "<base_64_line>";
byte iv[] = "<base_64_line>";
 
CryptoPP::CBC_Mode<CryptoPP::Rijndael>::Decryption decryption( key, 32, iv );
?
Если да, то здесь выход за пределы. Вы указали размер 32, хотя на самом деле размер этих массивов меньше.
0
Draiget
1 / 1 / 0
Регистрация: 02.05.2013
Сообщений: 31
Завершенные тесты: 2
25.09.2014, 19:23  [ТС] #25
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вот здесь, как я понимаю, так:
Тут указывается размер ключа, размер iv берется по BlockSize, т.е. 16.
C++
1
2
3
4
5
CipherModeFinalTemplate_CipherHolder(const byte *key, size_t length, const byte *iv)
{
    this->m_cipher = &this->m_object;
    this->SetKey(key, length, MakeParameters(Name::IV(), ConstByteArrayParameter(iv, this->m_cipher->BlockSize())));
}
C++
1
2
3
4
5
6
7
8
9
10
byte key[] = { 0x02, ..., 0x04 }; // 32 символа
byte iv[] = { 0x6a, ..., 0x41 }; // 16 символов
 
CryptoPP::CBC_Mode<CryptoPP::Rijndael>::Decryption decryption(key, 32, iv);
 
CryptoPP::StringSource decryptor(str_in, true,
    new CryptoPP::StreamTransformationFilter(decryption,
        new CryptoPP::StringSink(str_out)
    )
);
Ну и на всякий случай, я проверил вот таким способом:
C++
1
2
CryptoPP::CBC_Mode<CryptoPP::Rijndael>::Decryption decryption;
decryption.SetKeyWithIV(key, 32, iv, 16);
Аналогичные ошибки.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
25.09.2014, 19:36 #26
Повторюсь, я не знаю эту библиотеку. Но опять же - проблема с памятью. Что то пытается освободить то, что не было выделено. Или пытается записать туда.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2014, 19:36
Привет! Вот еще темы с ответами:

Access violation reading location - C++
Помогите пожалуйста! Создаю программу, которая ведет учет данных. В бинарный dat-файл записываются объекты класса (Account) -...

access violation reading location - C++
access violation reading location такая проблема если вести информацию про двух и больше студентов помогите пожалуйста очень срочно надо ...

Access violation reading location - C++
Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения, данного исключения (см. заголовок). На...

Дает ли register прирост в скорости? И есть ли толк в inline? - C++
Всем привет Читал про типы данных и набрел на такую переменную как register. Написано что если ее объявить в программе то, она...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Yandex
Объявления
25.09.2014, 19:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru