Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31

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

24.09.2014, 23:12. Показов 4571. Ответов 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());
        }
}

Если запускать без дебаггера, программа просто прекращает работу, подскажите куда копать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2014, 23:12
Ответы с готовыми решениями:

Ошибка v2_int128 = {<error reading variable>, <error reading variable>}
Компилируется нормально. Запускаю программу и как только совершаю действие, при котором генерится какой-либо сигнал - программа неожиданно...

Ошибка в Business Connector: error reading packages/SAP/code/jars/static/inqmyxml.jar; reading zip file central directory failed
У меня возник вопрос к форумчанам, извиняюсь, если такая тема есть. У всех у нас бывают дела, которые делать нужно, но совсем не хочется....

Ошибка: Parse error: syntax error, unexpected T_STRING in Z:\home\zateryaniezemli.ru\www\register.php on line 30
не работает строка: mysql query(SELECT * FROM igroki WHERE name=name); выдает ошибку Parse error: syntax error, unexpected...

25
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
25.09.2014, 00:25
1. Вы уверены, что читаете правильно стартовые байты? Вы читаете 1 байт в переменную размером 4 байта. Это не смертельно, но не совсем стыковка логики.
2. Вы уверены что size >= 126? Я думаю ошибка в этом. Вы просто трете стек.
3. Зачем Вам zCrypto::from_base64 на буфер?
4. Слишком много копирования буфера. Подумайте как избежать этого.
1
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 12:01  [ТС]
1. Разве у нас unsigned long не 8, или вы о другом?
2. Тут я пытался задавать буфер так-же по size, но разницы никакой, размер там около 44+- везде, думаю не в этом проблема.
3. Попробую без него сделать.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
25.09.2014, 13:04
1. Используйте std::string как буфер.
2. Вы уверены что Вы читаете сколько просите?

C++
1
2
3
4
    string buf(size, 0);
    size_t rb = f_hStream.read(&buf.c_str(), buf.size());
 
    assert(rb == buf.size());
п.с. Вы точно трете буфер. И точно при манипулировании с буфером и его размером. Будьте внимательны!
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 14:46
Draiget, в linux на 64 битной системе long 8 байтный. В linux x86 и в Windows x86/x64 он 4 байта.
C++
1
f_hStream.read( reinterpret_cast< char* >( &size ), sizeof( size ));
Цитата Сообщение от stima Посмотреть сообщение
size_t rb = f_hStream.read(&buf.c_str(), buf.size())
Что по Вашему возвращает std::string::c_str() ? И как вы туда собираетесь писать что то?

Добавлено через 1 минуту
Draiget, хотя, если Вы уверены, что размер хранится в 8 байтах, то используйте long long. Он везде 64 битный.
1
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 16:20  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
C++
1
2
3
string buf(size, 0);
* * size_t rb = f_hStream.read(&buf.c_str(), buf.size());
assert(rb == buf.size());
fstream::read не возвращает size_t, только std::basic_istream, ну и писать в &buf.c_str() невозможно, если только так:
C++
1
2
3
4
string buff(size, 0);
f_hStream.read(&buff[0], buff.size());
if ( buff.length() == 0 ) break;
string dec = zCrypto::decrypt( buff );
Но ошибка все равно есть, и если детальней смотреть она на return str_out; в функции дешифровки.
п.с. Поправил размер до 4х, думаю больше даже и не понадобиться, шарп пишет 8 байт при конверте ulong, поменял там на int32 и нормально стало.

Небольшое дополнение, вторая ошибка которая была на
C++
1
vector<string> header = split(dec, ';');
на самом деле возникает в конце условия:
C++
1
2
3
4
5
6
...
if (size > 0){
...
f_hStream.seekp(dataLen, ios_base::cur);
} else { //Вот тут, и один раз
...
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 16:37
Цитата Сообщение от Draiget Посмотреть сообщение
return str_out.data();
Во-первых:
std::string::data() возвращает указатель на внутренне представление строки в виде C-массива. Он действителен до тех пор, пока Вы не изменили строку.

Во-вторых ( вытекает из первого ):
После возвращения из функции decrypt объект str_out разрушается, следовательно указатель, который возвращает std::string::data() невалиден.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::string 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;
}
Добавлено через 9 минут
И еще - в C++98 не гарантируется, что последовательность, на которую указывает возвращаемый функцией std::string::data() указатель, будет заканчиваться символом конца строки ( '\0' ). Функция std::string::c_str() же это гарантирует. В С++11 std::string::data() и std::string::c_str() являются синонимами и возвращают одно и то же значение.
0
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 16:40  [ТС]
Извиняюсь, засунул старый код дешифровки в первый пост, я закоментил строки от старого и в аргументах был только const std::string& str_in, в качестве возвращаемое значения был std::string.

А если таким образом? Сие работает, но ошибки не пропали.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
string dec = string();
zCrypto::decrypt( dec, buff );
...
 
void zCrypto::decrypt(std::string& str_out, const std::string& str_in) { 
    const string key = zCrypto::from_base64("<base_64_line>");
    const string iv = zCrypto::from_base64("<base_64_line>");
 
    //std::string str_out;
    CryptoPP::CBC_Mode<CryptoPP::Rijndael>::Decryption decryption((byte*)key.c_str(), key.length(), (byte*)iv.c_str());
 
    CryptoPP::StringSource decryptor(str_in, true,
        new CryptoPP::StreamTransformationFilter(decryption,
            new CryptoPP::StringSink(str_out)
        )
    );
    
    //return str_out;
}
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 16:56
Ну раз с этим разобрались, тогда продолжаем. Что происходит в конструкторе Decryption?
Меня сильно смущает вот эта запись:
C++
1
CryptoPP::CBC_Mode<CryptoPP::Rijndael>::Decryption decryption((byte*)key.c_str(), key.length(), (byte*)iv.c_str());
И полный текст ошибок был бы кстати.

Добавлено через 10 минут
Непонятно, почему Вы используете std::string, когда в документации к Crypto++ везде используется собственный тип byte и SecByteBlock. Думаю, Вам нужно использовать именно их. Посмотрите пример вот здесь:
http://www.cryptopp.com/wiki/CBC_Mode
1
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 17:12  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
И полный текст ошибок был бы кстати.
pBlock - Variable is optimized away and not available.
retval - Error reading register value.

Немного скриншотов прилагается.

Цитата Сообщение от Toshkarik Посмотреть сообщение
Что происходит в конструкторе Decryption?
Хм, поменял на следующий код и ошибки на этом месте пропали, осталась только ошибка на } else { в главном коде
C++
1
2
3
4
5
6
    ...
byte key[] = { ... };
byte iv[] = { ... };
 
CryptoPP::CBC_Mode<CryptoPP::Rijndael>::Decryption decryption(key, 32, iv)
...
Миниатюры
Отладка: _free_base “Error reading register value”   Отладка: _free_base “Error reading register value”  
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 17:28
Draiget, на этом месте заканчивается блок, следовательно, объекты начинают уничтожаться, вызываются их деструкторы. Ошибка в одном из них.

Вы привели ошибки отладчика, он Вам говорит, что переменная pBlock не доступна, так как была убрана при оптимизации. Отлаживайте Debug версию. Вы, по всей видимости, пробуете отлаживать Release версию.

Я ранее не знаком был с данной библиотекой, и узнал о ней только в этой теме, поэтому не могу точно сказать, в чем проблема. Но, скорей всего, как и в функции decrypt, проблема в неправильном использовании типов/объектов.
0
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 17:37  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы, по всей видимости, пробуете отлаживать Release версию.
Угу, ибо я компилил Crypto++ под релизную, а под дебагом он не компилиться:
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in DLLMain.obj
error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in DLLMain.obj
Попробую посмотреть что там криво удаляется.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 17:43
Вот отсюда:
This problem arises in newer versions of Visual C++ (the older versions usually just silently linked the program and it would crash and burn at run time.) It means that some of the libraries you are linking with your program (or even some of the source files inside your program itself) are using different versions of the CRT (the C RunTime library.)

To correct this error, you need to go into your Project Properties (and/or those of the libraries you are using,) then into C/C++, then Code Generation, and check the value of Runtime Library; this should be exactly the same for all the files and libraries you are linking together. (The rules are a little more relaxed for linking with DLLs, but I'm not going to go into the "why" and into more details here.)

There are currently four options for this setting:

Multithreaded Debug
Multithreaded Debug DLL
Multithreaded Release
Multithreaded Release DLL
Your particular problem seems to stem from you linking a library built with "Multithreaded Debug" (i.e. static multithreaded debug CRT) against a program that is being built using the "Multithreaded Debug DLL" setting (i.e. dynamic multithreaded debug CRT.) You should change this setting either in the library, or in your program. For now, I suggest changing this in your program.

Note that since Visual Studio projects use different sets of project settings for debug and release builds (and 32/64-bit builds) you should make sure the settings match in all of these project configurations.
0
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 18:02  [ТС]
Я примерно помню как под дебаг компилить, немого поковырявшись сделал, теперь ошибка немного яснее, вы были правы насчет удаления:

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 */
Миниатюры
Отладка: _free_base “Error reading register value”  
0
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 18:14  [ТС]
Нашел я на каком месте он высирает ошибку, при удалении dec, проверял через delete &dec;

C++
1
2
3
4
5
6
7
string dec = string();
zCrypto::decrypt( dec, buff );
printf( "Header >> %s\n", dec.c_str() );
vector<string> header = split(dec, ';');
...
} else {
...
p.s. Сори за дабл, посты не редактирует старые.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 18:16
Цитата Сообщение от Draiget Посмотреть сообщение
delete &dec
Так нельзя делать. Это автоматический объект, он был создан на стеке, он сам освободить занятые ресурсы в деструкторе, после чего будет удален. Ошибка в том, что где то вызывается delete для объекта, который не был создал функцией new.
0
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 18:22  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
Так нельзя делать.
А если так? Ошибка то все равно на delete идет, еще до } else {. Но меня больше интересует, почему она там вообще возникает.
C++
1
2
3
string * dec = new string();
...
delete dec;
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 18:25
Я не смогу сказать без всего кода. Выложите его, будем разбираться. Как минимум, нужен весь блок
C++
1
2
3
if ( size > 0 ) {
   ...
}
0
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
25.09.2014, 18:32  [ТС]
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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
25.09.2014, 18:47
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.09.2014, 18:47
Помогаю со студенческими работами здесь

Use of register assumed to error
Написал такую программу .model tiny .data arr db 1,2,3,4,5 n dw $-arr start: lea bx,arr

Error reading memory : IO
Привет. Не могу установить режим sleep в микроконтроллере, выдает ошибку как только дохожу до строки sleep: Error reodyng memory...

Syntax error в Register: <%@ Register TagPrefix="sb" Namespace="SB.WebControls" Assembly="SB.WebControls"%>
Народ, помогите плз. чего ему не нравиться? &lt;%@ Register TagPrefix=&quot;sb&quot; Namespace=&quot;SB.WebControls&quot;...

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

Ошибка RLINK32: Error reading file
Недавно создал программу все было нормально. Через неделю открываю ее в delphi пытаюсь запустить и выдает ошибку: RLINK32: Error reading...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru