|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||||||
Getwchar stack smashing detected11.12.2018, 21:56. Показов 7095. Ответов 25
Всем привет. Кто сможет объяснить что происходит, вот этот код:
Кто подскажет где я умудрился ему стек переполнить?
0
|
||||||
| 11.12.2018, 21:56 | |
|
Ответы с готовыми решениями:
25
stack smashing detected
Stack smashing detected. Ребята, перемешка данных, что не так? |
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
||
| 12.12.2018, 21:52 | ||
|
То, что getwchar() редко используется, мало их оправдывает. Увеличение стека с 8 до 100 К позволяет в несколько раз удлинить входной поток. Но все равно выскакивает либо корка, либо переполнение стека. Добавлено через 2 минуты libc6:amd64 2.27-8 gcc (Debian 8.2.0-9) 8.2.0 Добавлено через 16 минут А вот у более старой libc6:amd64 2.13-38 все в порядке
1
|
||
| 12.12.2018, 22:08 | |||||||||||||||||
|
Они бывают "неориентированные", "узкой ориентации" и "широкой ориентации" ![]() Так вот, пока поток только открыт, но ещё не использовался - он "неориентированный" и первый вызов к-либо функции ввода/вывода "ориентирует" его в соотв. с этой функцией. Например(учтите, что getwchar() обращается к fgetwc()):
setlocale, по всей видимости взаимодействует с открытыми stdin/stdout переводя их "направленность" в значение по дефолту (узкое), потому и косяк вылазит при wide-char работе. Для кода ТС стоит убрать setlocale() - ошибка исчезнет, стоит обратиться wide-функцией к stdin до вызова setlocale() - ошибка тоже исчезнет: Кликните здесь для просмотра всего текста
3
|
|||||||||||||||||
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
||
| 12.12.2018, 22:25 | ||
|
По мне, это явный баг. Пусть тогда проверяют ориентацию потока и возвращают ошибку.
0
|
||
| 12.12.2018, 22:34 | ||
|
Надо попробовать без freopen() через stat() и setmode(). Вроде, не меняя то, что вернёт stat() и зарядив это в setmode можно "сбросить" ориентированность. Так же что-то читал про сброс буферов, персонально по stdin/stdout
0
|
||
|
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
|
||
| 13.12.2018, 20:12 | ||
|
1
|
||
| 13.12.2018, 23:49 | ||
|
Прогнал код через strace - c setlocale и без. Да, setlocale дважды открывает свои файлы /usr/lib/locale/locale-archive и /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache и только потом (перед первым использованием stdin) вызывается stat() и read() для stdin`а открытого сразу execve(наша_косячная_прога) Выхлоп стартап-кода вырезал - там всё одинаково. Косячный Кликните здесь для просмотра всего текста
brk(NULL) = 0x55e2d88b4000 brk(0x55e2d88d5000) = 0x55e2d88d5000 open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_dev=makedev(8, 1), st_ino=5247872, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=3144, st_size=1679808, st_atime=2018-12-13T21:26:50+0500.124037805, st_mtime=2018-03-20T13:00:34+0500.821409394, st_ctime=2018-03-20T13:00:34+0500.821409394}) = 0 mmap(NULL, 1679808, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5456828000 close(3) = 0 open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3 fstat(3, {st_dev=makedev(8, 1), st_ino=5251089, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=56, st_size=26258, st_atime=2018-12-13T21:26:50+0500.556039947, st_mtime=2018-01-14T15:39:44+0500, st_ctime=2018-03-20T12:57:18+0500.885313523}) = 0 mmap(NULL, 26258, PROT_READ, MAP_SHARED, 3, 0) = 0x7f54569d5000 close(3) = 0 fstat(0, {st_dev=makedev(0, 17), st_ino=4, st_mode=S_IFCHR|0620, st_nlink=1, st_uid=1000, st_gid=5, st_blksize=1024, st_blocks=0, st_rdev=makedev(136, 1), st_atime=2018-12-14T01:25:12+0500.476080882, st_mtime=2018-12-14T01:25:12+0500.476080882, st_ctime=2018-12-14T01:10:19+0500.476080882}) = 0 read(0, "123123\n", 1024) = 7 read(0, "\n", 1024) = 1 read(0, "1231\n", 1024) = 5 lseek(0, -5, SEEK_CUR) = -1 ESPIPE (Illegal seek) exit_group(0) = ? +++ exited with 0 +++ Без setlocale Кликните здесь для просмотра всего текста
fstat(0, {st_dev=makedev(0, 17), st_ino=4, st_mode=S_IFCHR|0620, st_nlink=1, st_uid=1000, st_gid=5, st_blksize=1024, st_blocks=0, st_rdev=makedev(136, 1), st_atime=2018-12-14T01:18:16+0500.476080882, st_mtime=2018-12-14T01:18:16+0500.476080882, st_ctime=2018-12-14T01:10:19+0500.476080882}) = 0 brk(NULL) = 0x56344f007000 brk(0x56344f028000) = 0x56344f028000 read(0, "12311111111111111111111111111\n", 1024) = 30 lseek(0, -20, SEEK_CUR) = -1 ESPIPE (Illegal seek) exit_group(0) = ? +++ exited with 0 +++ Учитывая, что работа идёт через read(), которому до лампочки всё(просто поток байт), то рыть надо сам libc Просто жутко интересно, вроде должно пахать - ан нет... Обходных манёвров уже насобирали, а вот что бы понять суть...
0
|
||
|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
|
| 14.12.2018, 00:00 [ТС] | |
|
Да вот суть хотелось бы понять. У самого у меня квалификации не хватит разобраться я к сожалению только в начале пути. Но с удовольствием понаблюдаю за дискуссией.
0
|
|
| 14.12.2018, 00:03 | |
|
Покопался в fwide() - мультибайт расширяет привычную нам структуру FILE, там появляется и свой буфер, и привязывается iconv и ещё что-то... И, самое главное, то, чем манипулирует fwide() - поле _mode (fwide его нормализирует в -1,0,1 , обеспечивает блокировки, проверки и т.п.)
0
|
|
|
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
|
|||||||
| 14.12.2018, 09:38 | |||||||
|
Покрайней мере у меня оно падает именно в libc при выходе.
А вообще надо glibcшникам баг открыть, пусть сами ковыряются.
1
|
|||||||
| 14.12.2018, 09:54 | |
|
Думаю дело не в этой функции. Неверно инициализируются FILE структуры... Надо будет сравнить содержимое stdin до вызова setlocale и и после. Так же глянуть в какой именно момент при fgetwc устанавливается "направленность" потока.
Что-то и где-то они забыли проинициализировать... Если же поменять if (delta != 0) на if (delta > 0), то вместо вылета будем получать WEOF или к-нить errno, что тоже не красиво.
0
|
|
|
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
|
|||||||||||||
| 14.12.2018, 10:28 | |||||||||||||
Добавлено через 20 минут Думаю там должно быть такое.
Добавлено через 1 минуту Но, нужно глубже вникать в это, а что-то не хочется
0
|
|||||||||||||
| 14.12.2018, 20:07 | |||||||
|
Бу-га-га...
0
|
|||||||
|
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
|
||||||
| 14.12.2018, 21:16 | ||||||
|
setlocale() не виноватая вообще. Она и близко не прикасается к stdin. Баг будет проявляться на всех кодировках с символами переменной длины т.е. когда ф-ция do_encoding() возвращает -1;
Запустил пересборку glibc с патчем из 12го сообщения. Дома ноут старенький, минут 7 еще ждать Добавлено через 24 минуты Дождался. Вот это помогает, и вроде ничего не ломает.
Да, и в качестве воркэраунда имхо лучшим вариантом будет __fpurge(stdin); перед выходом.
2
|
||||||
|
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
|
|||
| 15.12.2018, 10:11 | |||
|
Что меня больше всего удивляет, коду более 15 лет и я не смог нагуглить ни одного упоминания о проблеме.
0
|
|||
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
||
| 15.12.2018, 15:42 | ||
|
Поленится или нет moskitos80 открыть баг glibc, но патч prik будет в любом случае востребован.
0
|
||
|
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
|
|||
| 15.12.2018, 18:13 | |||
|
2
|
|||
| 15.12.2018, 20:15 | |
|
К стати это не оно?
https://www.linux.org.ru/forum/general/12361599 https://sourceware.org/bugzill... i?id=20568
0
|
|
|
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
|
||
| 15.12.2018, 20:30 | ||
|
Печально, что в багзиле баг открыт с 16го кода и авторам пох
1
|
||
| 15.12.2018, 20:30 | |
|
Помогаю со студенческими работами здесь
20
Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun" [bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>' Есть ли связь между STL-stack и stack - высокопроизводительная память? error C2440: 'return' : cannot convert from 'stack<X>' to 'stack<X> *' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|