Ошибка сегментации происходит, если нет std :: flush

Есть уже несколько подходов к этому вопросу. ¹ ²
³

Но этот совершенно другой! Если я закомментирую std::flush строка, происходит ошибка сегмента, но если я добавлю эту строку, ошибка сегментации не произойдет!

int Stm32Serial::writeToSerial()
{
/// TODO Write handle for writing if necessary
/// int serial_write_ret;
if ( USE_USB )
{
usb_port.writeBytes ( stm_buf_t, stm_buf_t[LENGTH_INDEX] );
return SERIAL_RET;
}
else
{
std::cout << std::flush; // TODO HACK Remove it!
serial_port.sendBuff ( stm_buf_t, stm_buf_t[LENGTH_INDEX] );
return SERIAL_RET;
}
}

Тоже попробовал gdb; Я использую эту функцию в ROS с этот техника отладки и компиляция с опцией -g но он не печатает имена функций

Program received signal SIGSEGV, Segmentation fault.
__mempcpy_sse2 () at ../sysdeps/x86_64/memcpy.S:142
142 ../sysdeps/x86_64/memcpy.S: No such file or directory.
(gdb) bt
#0  __mempcpy_sse2 () at ../sysdeps/x86_64/memcpy.S:142
#1  0x6564656563786520 in ?? ()
#2  0x20726f7272652064 in ?? ()
#3  0x6c6f687365726874 in ?? ()
#4  0x2e30203a79622064 in ?? ()
#5  0x202c323537373431 in ?? ()
#6  0x697420656c637963 in ?? ()
#7  0x36312e30203a656d in ?? ()
#8  0x2c31343936373632 in ?? ()
#9  0x6f68736572687420 in ?? ()
#10 0x32302e30203a646c in ?? ()
#11 0x742064616572202c in ?? ()
#12 0x312e30203a656d69 in ?? ()
#13 0x3530333430353233 in ?? ()
#14 0x657461647075202c in ?? ()
#15 0x30203a656d697420 in ?? ()
#16 0x373430353233312e in ?? ()
#17 0x74697277202c3234 in ?? ()
#18 0x203a656d69742065 in ?? ()
#19 0x3637363236312e30 in ?? ()
#20 0x006d305b1b333637 in ?? ()
#21 0x00007fffffffbbf0 in ?? ()
#22 0x00000000ffffbbd8 in ?? ()
---Type <return> to continue, or q <return> to quit---
#23 0x00007fff00000000 in ?? ()
#24 0x0000000000000000 in ?? ()
(gdb)
  • Искал LENGTH_INDEX а также stm_buf_t[]там все ок.

А также; Если я позвоню std::cout << std::flush; из другого места, где есть вызов этой функции, он также обрабатывает Segfault!

...
genSum ( stm_buf_t );
writeToSerial();
std::cout << std::flush;
...

Каким может быть мой следующий подход?

0

Решение

Опытный ботаник заметит, что стек полон ASCII. Это почти всегда является признаком переполнения буфера в strcpy или подобном для локальной переменной.

Я преобразовал некоторые адреса стека из шестнадцатеричного в ASCII. Похоже, читать в обратном направлении.

rorre dedeecxe rorre dlohserht.0: yb d, 257741it elcyc61.0: em, 1496762ohserht 20.0: dlt daer, 1.0: emi50340523etadpu, 0: emit

Появляется первый бит «ошибка превышения порога ошибки». Осматривает в вашем коде или входном файле этот текст и видит, где он используется в коде. Почти наверняка будет копия памяти, которая перезаписывает локальный буфер.

Как отмечается в комментарии, Valgrind часто сталкивается с подобными проблемами.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector