Пытаюсь найти причину сегфолта в приложении (linux, x86). gdb показывает что падает внутри wstringstream::operator<<(). Грубо говоря, соответствующий фрагмент функции выглядит так:
char* buff = new char[size];
// заполняем buff и за его границы точно нигде не выходим
...
std::wstringstream wss;
wss << buff;
Затем попробовал запустить под valgrind'ом и получил «Invalid write of size 4» внутри wstringstream::operator<<() и дальше мол адрес принадлежит стеку треда X.
После этого решил проанализировать стек в gdb после сегфолта и вот здесь обнаружил что при вызове wstringstream::operator<<() регистр esp уменьшился на ~2000000, а в этом стековом фрейме лежит wchar_t-представление buff. Иначе говоря выглядит будто wstringstream::operator<<() преобразовал buff из char[] в wchar_t[] прямо на стеке и тем самым вышел за его пределы. Как-то мне совсем не верится что std::wstringstream выполняет преобразование на стеке, а не в динамической памяти. Может у кого какие соображения есть по этому поводу?
PS: я понимаю что следующим шагом должен быть анализ wstringstream::operator<<(), но для этого нужно иметь либо его исходники которых на данный момент у меня нет (известно что конечное приложение собирали gcc, а вот какой именно версией пока выяснить не удалось) либо ковыряться с ассемблерным кодом на что у меня желания нет