|
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
|
||||||
Getwchar stack smashing detected11.12.2018, 21:56. Показов 6976. Ответов 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> *' Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|