MS Visual Studio 2008, STL
От: Novik65  
Дата: 07.11.08 13:25
Оценка:
Приветствую.
Проект скомпилирован с Maximize Speed (/O2) и Only __inline (/Ob1). Получаю такое вот забавное раскрытие insert:

std::vector<unsigned int,std::allocator<unsigned int> >::insert(std::_Vector_const_iterator<unsigned int,std::allocator<unsigned int> >, const unsigned int &)

iterator insert(const_iterator _Where, const _Ty& _Val)
        {    // insert _Val at _Where
        size_type _Off = size() == 0 ? 0 : _Where - begin();
        _Insert_n(_Where, (size_type)1, _Val);
        return (begin() + _Off);
004A0AAE  mov         edi,dword ptr [esi+0Ch] 
004A0AB1  cmp         edi,dword ptr [esi+10h] 
004A0AB4  jbe         std::vector<unsigned int,std::allocator<unsigned int> >::insert+6Ch (4A0ABCh) 
004A0AB6  call        dword ptr [__imp___invalid_parameter_noinfo (518314h)] 
004A0ABC  mov         esi,dword ptr [esi] 
004A0ABE  mov         ebp,esi 
004A0AC0  mov         dword ptr [esp+14h],edi 
004A0AC4  test        esi,esi 
004A0AC6  jne         std::vector<unsigned int,std::allocator<unsigned int> >::insert+90h (4A0AE0h) 
004A0AC8  call        dword ptr [__imp___invalid_parameter_noinfo (518314h)] 
004A0ACE  xor         eax,eax 
004A0AD0  lea         edi,[edi+ebx*4] 
004A0AD3  cmp         edi,dword ptr [eax+10h] 
004A0AD6  ja          std::vector<unsigned int,std::allocator<unsigned int> >::insert+9Bh (4A0AEBh) 
004A0AD8  test        esi,esi 
004A0ADA  je          std::vector<unsigned int,std::allocator<unsigned int> >::insert+94h (4A0AE4h) 
004A0ADC  mov         esi,dword ptr [esi] 
004A0ADE  jmp         std::vector<unsigned int,std::allocator<unsigned int> >::insert+96h (4A0AE6h) 
004A0AE0  mov         eax,dword ptr [esi] 
004A0AE2  jmp         std::vector<unsigned int,std::allocator<unsigned int> >::insert+80h (4A0AD0h) 
004A0AE4  xor         esi,esi 
004A0AE6  cmp         edi,dword ptr [esi+0Ch] 
004A0AE9  jae         std::vector<unsigned int,std::allocator<unsigned int> >::insert+0A1h (4A0AF1h) 
004A0AEB  call        dword ptr [__imp___invalid_parameter_noinfo (518314h)] 
004A0AF1  mov         eax,dword ptr [esp+1Ch] 
004A0AF5  mov         dword ptr [eax+4],edi 
004A0AF8  pop         edi  
004A0AF9  pop         esi  
004A0AFA  mov         dword ptr [eax],ebp 
004A0AFC  pop         ebp  
004A0AFD  pop         ebx


Ессно, фрагмент
xor         eax,eax
cmp         edi,dword ptr [eax+10h]

приводит к вылету в catch блок ввиду попытки чтения по указателю 0x10. Кто виноват, и что с этим безобразием делать?
Re: MS Visual Studio 2008, STL
От: remark Россия http://www.1024cores.net/
Дата: 07.11.08 13:42
Оценка: +1
Здравствуйте, Novik65, Вы писали:

N>Ессно, фрагмент

N>
N>xor         eax,eax
N>cmp         edi,dword ptr [eax+10h] 
N>

N>приводит к вылету в catch блок ввиду попытки чтения по указателю 0x10. Кто виноват, и что с этим безобразием делать?

Минимальный фрагмент кода, как ты создаёшь и используешь std::vector, не помешал бы.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: MS Visual Studio 2008, STL
От: Novik65  
Дата: 07.11.08 14:07
Оценка:
Здравствуйте, remark, Вы писали:

R>Минимальный фрагмент кода, как ты создаёшь и используешь std::vector, не помешал бы.


std::vector<unsigned int> vec;
unsigned int d = 1;
vec.push_back(d);


По ходу дела для соотв. insert генерится фрагмент
iterator insert(const_iterator _Where, const _Ty& _Val)
        {    // insert _Val at _Where
// тут ассемблер поскипал
        size_type _Off = size() == 0 ? 0 : _Where - begin();
        _Insert_n(_Where, (size_type)1, _Val);
004328E6  mov         edx,dword ptr [esp+28h] 
004328EA  mov         eax,dword ptr [esp+24h] 
004328EE  mov         ecx,dword ptr [esp+20h] 
004328F2  push        edx  
004328F3  push        1    
004328F5  push        eax  
004328F6  push        ecx  
004328F7  mov         ecx,esi 
004328F9  call        std::vector<unsigned int,std::allocator<unsigned int> >::_Insert_n (432660h) 
        return (begin() + _Off);
004328FE  mov         edi,dword ptr [esi+0Ch] 
00432901  cmp         edi,dword ptr [esi+10h] 
00432904  jbe         std::vector<unsigned int,std::allocator<unsigned int> >::insert+6Ch (43290Ch) 
00432906  call        dword ptr [__imp___invalid_parameter_noinfo (518334h)] 
0043290C  mov         esi,dword ptr [esi] 
0043290E  mov         ebp,esi 
00432910  mov         dword ptr [esp+14h],edi 
00432914  test        esi,esi 
00432916  jne         std::vector<unsigned int,std::allocator<unsigned int> >::insert+90h (432930h) 
00432918  call        dword ptr [__imp___invalid_parameter_noinfo (518334h)] 
0043291E  xor         eax,eax 
00432920  lea         edi,[edi+ebx*4] 
00432923  cmp         edi,dword ptr [eax+10h]

т.е. опять таки любимый xor и доступ к 0x10. Разумеется, приведенный C++ фрагмент при выполнении туда никогда не попадет. Но зачем оно такое генерит вообще?
Реальный случай (когда таки попадает) связан с использованием FreeImageLib, при генерации тумбнэйла на вход подаются кривые данные. И вот такой привет.
Re[3]: MS Visual Studio 2008, STL
От: Rocky  
Дата: 07.11.08 14:27
Оценка:
Здравствуйте, Novik65, Вы писали:

N>
N>std::vector<unsigned int> vec;
N>unsigned int d = 1;
N>vec.push_back(d);
N>


У меня это отработало без багов и как ожидалось.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: MS Visual Studio 2008, STL
От: Аноним  
Дата: 07.11.08 15:13
Оценка:
Здравствуйте, Novik65, Вы писали:

N>Здравствуйте, remark, Вы писали:


R>>Минимальный фрагмент кода, как ты создаёшь и используешь std::vector, не помешал бы.


[кусь]

N>т.е. опять таки любимый xor и доступ к 0x10. Разумеется, приведенный C++ фрагмент при выполнении туда никогда не попадет. Но зачем оно такое генерит вообще?

N>Реальный случай (когда таки попадает) связан с использованием FreeImageLib, при генерации тумбнэйла на вход подаются кривые данные. И вот такой привет.

Так может все-таки покажешь какой реальный случай приводит к проблеме?
Re: MS Visual Studio 2008, STL
От: rus blood Россия  
Дата: 07.11.08 16:07
Оценка: 2 (1)
Здравствуйте, Novik65, Вы писали:

N>Приветствую.

N>Проект скомпилирован с Maximize Speed (/O2) и Only __inline (/Ob1). Получаю такое вот забавное раскрытие insert:

N>
N>004A0AC8  call        dword ptr [__imp___invalid_parameter_noinfo (518314h)] 
N>004A0ACE  xor         eax,eax 
N>004A0AD0  lea         edi,[edi+ebx*4] 
N>004A0AD3  cmp         edi,dword ptr [eax+10h] 
N>



В коде вроде нет перехода на точку 004A0ACE.
А перед ней, судя по всему, вызов функции, которая не должна вернуться в исходную точку.
Я бы посмотрел, что делает эта функция.

Проблема возникает на некорректных данных?
Имею скафандр — готов путешествовать!
Re[2]: MS Visual Studio 2008, STL
От: Novik65  
Дата: 07.11.08 17:19
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>В коде вроде нет перехода на точку 004A0ACE.


Есть, смотрите внимательнее. Достаточно, чтобы не отработал jne по адресу 004A0AC6.

RB>А перед ней, судя по всему, вызов функции, которая не должна вернуться в исходную точку.

RB>Я бы посмотрел, что делает эта функция.

Я не только посмотрел, но и использовал ее. Это перехватчик случая "некорректный параметр передан в CRT функцию", он вполне себе перекрывается (см. _set_invalid_parameter_handler) и таки да, предполагает нормальный возврат. Причем этот самый возврат предполагается даже в случае умолчательной реализации обработчика (всплыв стандартного окошка Abort/Retry/Continue).

RB>Проблема возникает на некорректных данных?


Да. Но по понятной причине до обработки (т.е. выкидывания соотв. исключения) речь не доходит.
Re[3]: MS Visual Studio 2008, STL
От: Novik65  
Дата: 07.11.08 17:32
Оценка:
N>Причем этот самый возврат предполагается даже в случае умолчательной реализации обработчика (всплыв стандартного окошка Abort/Retry/Continue).

Однако, написал, и таки засомневался. Надо в понедельник посмотреть подробнее, возможно, что с предположением предполагаемого невозврата из обработчика Вы правы. Хотя из документации этого не следует.
Re[4]: MS Visual Studio 2008, STL
От: Аноним  
Дата: 11.11.08 13:27
Оценка:
Здравствуйте, Novik65, Вы писали:

N>>Причем этот самый возврат предполагается даже в случае умолчательной реализации обработчика (всплыв стандартного окошка Abort/Retry/Continue).


N>Однако, написал, и таки засомневался. Надо в понедельник посмотреть подробнее, возможно, что с предположением предполагаемого невозврата из обработчика Вы правы. Хотя из документации этого не следует.


Господи!!! молодой человек, ну Вас же проcили показать реальным пример (С++ код)
того ГДЕ у Вас проявляется ошибка.
КОД показать, а не то ассемблерное замудрение, что Вы выложили..
С++ код, то, что Вы набивали в редакторе с *.cxx файле.
Просто С++ код.
Re[5]: MS Visual Studio 2008, STL
От: Аноним  
Дата: 14.11.08 09:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Господи!!! молодой человек, ...


Это называется — "горе от ума"...
Re[5]: MS Visual Studio 2008, STL
От: Novik65  
Дата: 14.11.08 11:39
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Господи!!! молодой человек, ну Вас же проcили показать реальным пример (С++ код)
А>того ГДЕ у Вас проявляется ошибка.
А>КОД показать, а не то ассемблерное замудрение, что Вы выложили..

1) Вы мне льстите. Молодым человеком, к сожалению, я был лет эдак 20 назад.
2) Я показал то, что меня интересовало. И таки ответ получил.
3) Если для Вас это "замудрение" — зачем Вы лезете в тему?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.