Очень странный баг при конкатенации строк.
От: Аноним  
Дата: 12.10.11 14:11
Оценка:
В общем такие проблемы обычно решаются довольно быстро.
Но тут вообще в ступор встал.

В общем вылетает с эксепшином у меня вот в таком месте:


virtual bool some_member_func(std::string& a)
{
    m_some_member_string += a; //m_some_member_string - тоже std::string
    return true;
}


Исключение происходит на выделении памяти, потому что новый размер неадекватно большой (0x2dcf9d70).
Но, что самое интересное: состояние обоих переменных нормальное.

Переменная m_some_member_string (она фактически пустая):

+        std::_String_val<char,std::allocator<char> >    {_Alval={...} }    std::_String_val<char,std::allocator<char> >
        npos    0xffffffff    const unsigned int
+        _Bx    {_Buf=0x04aeef58 "" _Ptr=0x2e900000 <Bad Ptr> }    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
        _Mysize    0x00000000    unsigned int
        _Myres    0x0000000f    unsigned int

Переменная а(в ней 16 байт записано):
+        std::_String_val<char,std::allocator<char> >    {_Alval={...} }    std::_String_val<char,std::allocator<char> >
        npos    0xffffffff    const unsigned int
+        _Bx    {_Buf=0x04aedf08 "8’™ММММММММММММ" _Ptr=0x03999238 "502 Unknown Host" }    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
        _Mysize    0x00000010    unsigned int
        _Myres    0x0000009f    unsigned int


Что-то нелепое происходит в файле xstring line 954:


    _Myt& __CLR_OR_THIS_CALL append(const _Myt& _Right,
        size_type _Roff, size_type _Count)
        {    // append _Right [_Roff, _Roff + _Count)
        if (_Right.size() < _Roff)
            _String_base::_Xran();    // _Roff off end
        size_type _Num = _Right.size() - _Roff; //каким-то нелепым образом, в значение _Num попадает 0x2dcf9d70, хотя я ясно вижу в отладчике что _Right.size() равен 16 а _Roff = 0!!!
        if (_Num < _Count)
            _Count = _Num;    // trim _Count to size
        if (npos - _Mysize <= _Count || _Mysize + _Count < _Mysize)
            _String_base::_Xlen();    // result too long

        if (0 < _Count && _Grow(_Num = _Mysize + _Count))
            {    // make room and append new stuff
            _Traits_helper::copy_s<_Traits>(_Myptr() + _Mysize, _Myres - _Mysize,
                _Right._Myptr() + _Roff, _Count);
            _Eos(_Num);
            }
        return (*this);
        }

Обе этих переменных 100% используются только в этом потоке, никто к ним доступа не имеет.
Я сначала думал что какой-то другой поток затер в памяти эту переменную после вычисления реальной длины, но ошибка воспроизводится ровно в том же месте каждый раз.

У кого есть какие мнения как ловить багу.
Я склоняюсь все таки в сторону что кто-то херит память... но как ловить ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.