Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
В чем тут баг? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Ошибка автор--------------------------- Microsoft Visual C++ Runtime Library --------------------------- Debug Error! HEAP CORRUPTION DETECTED: after Normal block (#62) at 0x0000024B639396F0. CRT detected that the application wrote to memory after end of heap buffer. (Press Retry to debug the application) --------------------------- Прервать Повтор Пропустить --------------------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 14:19 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Под конец строки забыл место выделить Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 14:33 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Посмотрел лог компилятора, при сборке он выдает вот это: автор warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. Проблема в этих функциях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 14:34 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Dima TПод конец строки забыл место выделить Код: plaintext 1. Действительно! Теперь работает как надо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 14:36 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
EoltПосмотрел лог компилятора, при сборке он выдает вот это: автор warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. Проблема в этих функциях? Нет, в них ТОЖЕ ПРОБЛЕМА, но другая, и с ней ты пока ещё не столкнулся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 14:44 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. ещё может быть проблема (другая уже) тут, в lib_push_string передаётся строка, а потом эта строка уничтожается. Если lib_push_string эту строку только копирует себе, и забывает, то всё ок, елси она сохранят ссылку на эту строку, то будут проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 14:46 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Как я понимаю, тип char и функции strcpy и strcat использовать не безопасно? Надо преобразовывать строки в какой-нибудь vector<string> и работать уже с ним? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 15:05 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
EoltКак я понимаю, тип char и функции strcpy и strcat использовать не безопасно?это такой специфик от майкрософта, объявлять стандартные функции из CRTL депрекатед. Нужно для того, чтобы нельзя было написать переносимый код, я так щитаю )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 15:51 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
EoltКак я понимаю, тип char ... использовать не безопасно?Тип char использовать безопасно: Код: plaintext 1. 2. EoltКак я понимаю, ... функции strcpy и strcat использовать не безопасно?Тут дело даже не в безопасности, а в том, что при нормальной работе со строками, эти функции просто не нужны. Если работаем со строками в C-шном стиле, и нужна конкатенация строк, то это делается как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. без всяких strcpy/strcat. А если работаем со строками в C++-ном стиле (то есть используем std::string или его аналог), то эти функции и подавно не нужны. EoltНадо преобразовывать строки в какой-нибудь vector<string> и работать уже с ним?В каком стиле работать со строками -- это вы уж сами решайте, они оба имеют право на жизнь. C++-ный стиль проще, потому что не надо строки вручную уничтожать. egorychэто такой специфик от майкрософта, объявлять стандартные функции из CRTL депрекатед. Нужно для того, чтобы нельзя было написать переносимый код, я так щитаю ))Да, есть у Microsoft такая черта, тем или иным способом пытаться привязать пользователей к своим продуктам. Так называемый «vendor lock». ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 05:27 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
EoltMasterZiv, Как я понимаю, тип char и функции strcpy и strcat использовать не безопасно? Надо преобразовывать строки в какой-нибудь vector<string> и работать уже с ним? нет, ты понимаешь неправильно. это проблемы стандартной библиотеки языка С, к С++они вообще не имеют отношения. проблемы в том, что strcpy и strcat и некоторые другие функции CRTL в принципе не могут контролировать переполнение буфера памяти, куда они пишут - у них нет соответствующего входного параметра, размера буфера. чтобы преодолеть эти проблемы, в современных версиях CRTL включают новые функции, аналогичные по назначению старым, но с дополнительными параметрами, позволяющими контролировать размер выходного буфера. это относится еще к функциям семейства sprintf , и некоторым другим. также подобным образом решают проблемы с нереентерабельностью некоторых функций CRT типа strtok . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 11:16 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Пётр Седовegorychэто такой специфик от майкрософта, объявлять стандартные функции из CRTL депрекатед. Нужно для того, чтобы нельзя было написать переносимый код, я так щитаю ))Да, есть у Microsoft такая черта, тем или иным способом пытаться привязать пользователей к своим продуктам. Так называемый «vendor lock». да ни при чем тут это, это проблема безопасности кода, и с этим борятся все производители компиляторов, в POSIX все то же самое. Я кстати потом проверю, совпадают ли MS расширения с POSIX. Дело в том, что С и юникс делали красноглазики-хакеры, и им далеко не всегда было дело до таких проблем, как безопасность ПО, красивый и компактный код был важнее. А уже потом все стали за головы хвататься, "Ааааа у нас же может быть переполнение! Аааа, тут же код не потокобезопасный!" Теперь код классического cp из книги Прата , наверное, громоздок и ужасен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 11:25 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
MasterZivЯ кстати потом проверю, совпадают ли MS расширения с POSIX.посмотри, пожалуйста, это интересно, для общего развития. MasterZiv в современных версиях CRTL включают новые функции, аналогичные по назначению старым, но с дополнительными параметрами, позволяющими контролировать размер выходного буфераЯ только не совсем понимаю, как этот входной параметр увеличит безопасность кода? Если я указал в нём неправильное значение, то совершенно так же будет портиться память, как и в функциях без этого параметра. Ничего оно там само контролировать не может, просто уровень совершения ошибки выдвинут чуть-чуть вперёд. Это - неразрешимая проблема в С, и чтобы от неё избавиться, надо пользоваться С++ и соответствующими классами работы со строками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 13:59 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
egorychMasterZivЯ кстати потом проверю, совпадают ли MS расширения с POSIX.посмотри, пожалуйста, это интересно, для общего развития. Например vsnprintf() вроде как C++11 а у МС ее нет, зато есть vsprintf_s() fopen() по мнению MS опасный, поэтому в ворнингах рекомендуется использовать fopen_s() Вобщем у МС как обычно все не как у всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 14:24 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
egorychЯ только не совсем понимаю, как этот входной параметр увеличит безопасность кода? Если я указал в нём неправильное значение, то совершенно так же будет портиться память, как и в функциях без этого параметра. Ничего оно там само контролировать не может, просто уровень совершения ошибки выдвинут чуть-чуть вперёд. Размер буфера предназначен для защиты от преднамеренных атак юзеров на переполнение буфера, а не для защиты от ошибок программиста. И эту функцию он отлично выполняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 14:35 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
MasterZivпроблемы в том, что strcpy и strcat и некоторые другие функции CRTL в принципе не могут контролировать переполнение буфера памяти, куда они пишут - у них нет соответствующего входного параметра, размера буфера. чтобы преодолеть эти проблемы, в современных версиях CRTL включают новые функции, аналогичные по назначению старым, но с дополнительными параметрами, позволяющими контролировать размер выходного буфера.Создание аналогов старых C-шных функций с дополнительным параметром «длина буфера, в который писать результат» -- это костыльное решение. Нормальное решение -- если функция возвращает строку в качестве результата, то она и выделяет память под строку, а пользователь функции должен эту память освободить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 14:48 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyРазмер буфера предназначен для защиты от преднамеренных атак юзеров на переполнение буфера, а не для защиты от ошибок программиста. И эту функцию он отлично выполняет.понял, спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 14:50 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Пётр СедовСоздание аналогов старых C-шных функций с дополнительным параметром «длина буфера, в который писать результат» -- это костыльное решение. Нормальное решение -- если функция возвращает строку в качестве результата, то она и выделяет память под строку, а пользователь функции должен эту память освободить. Это ненормальное решение для С, да и вообще, потому что не всегда выделение памяти вообще возможно. Представь себе архитектуру, где malloc всегда возвращает 0... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 14:55 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
MasterZivПётр СедовСоздание аналогов старых C-шных функций с дополнительным параметром «длина буфера, в который писать результат» -- это костыльное решение. Нормальное решение -- если функция возвращает строку в качестве результата, то она и выделяет память под строку, а пользователь функции должен эту память освободить. Это ненормальное решение для С,Ну вот например библиотека GLib написана на чистом C. // https://developer.gnome.org/glib/stable/glib-String-Utility-Functions.html#g-strdup-printf g_strdup_printf () Код: plaintext 1. 2. 3. Similar to the standard C sprintf() function but safer, since it calculates the maximum space required and allocates memory to hold the result. The returned string should be freed with g_free() when no longer needed. ... Returns a newly-allocated string holding the result MasterZivда и вообще, потому что не всегда выделение памяти вообще возможно. Представь себе архитектуру, где malloc всегда возвращает 0...Так это скорее всего какие-нибудь embedded платформы, обычные программы туда не портируют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 15:29 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, кто знает что куда портируют? ты предлагаешь туда еще и CRT всегда портировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 11:26 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Пётр СедовMasterZivпроблемы в том, что strcpy и strcat и некоторые другие функции CRTL в принципе не могут контролировать переполнение буфера памяти, куда они пишут - у них нет соответствующего входного параметра, размера буфера. чтобы преодолеть эти проблемы, в современных версиях CRTL включают новые функции, аналогичные по назначению старым, но с дополнительными параметрами, позволяющими контролировать размер выходного буфера.Создание аналогов старых C-шных функций с дополнительным параметром «длина буфера, в который писать результат» -- это костыльное решение. Нормальное решение -- если функция возвращает строку в качестве результата, то она и выделяет память под строку, а пользователь функции должен эту память освободить.Это долго и не всегда нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 13:34 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
SiemarglЭто долго и не всегда нужно. да и не совсем ясно, из какого пула выделять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2016, 16:27 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
MasterZivкто знает что куда портируют?Я знаю, что серьёзные программы повсеместно используют динамическое распределение памяти, поэтому портировать их на embedded платформы без heap-а никто не будет. MasterZivты предлагаешь туда еще и CRT всегда портировать?Я предлагаю забыть функции strcpy/strcat. А их костыльные аналоги, которые Visual C++ пытается подсунуть программисту, даже рассматривать не стоит. SiemarglПётр Седовпропущено... Создание аналогов старых C-шных функций с дополнительным параметром «длина буфера, в который писать результат» -- это костыльное решение. Нормальное решение -- если функция возвращает строку в качестве результата, то она и выделяет память под строку, а пользователь функции должен эту память освободить.Это долго и не всегда нужно.Ну а как тогда делать конкатенацию строк, если работаем со строками в C-шном стиле? Именно про это шла речь в первом сообщении. Размазывать по всему коду вызовы функций strcpy/strcat? Мне такой способ не нравится: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ИзопропилSiemarglЭто долго и не всегда нужно. да и не совсем ясно, из какого пула выделятьЕсли заморачиваться на скорость работы программы, то у каждого thread-а должен быть свой личный heap для временных блоков памяти с коротким временем жизни. Если не заморачиваться, то можно просто использовать heap процесса (malloc/free, глобальные new/delete). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 03:59 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, Тебе не нравится, что strcat "пробегает" ? Так а если сравнить с кодом malloc и учесть время на переключение контекста/системный вызов выделения памяти? Кто не хочет заморачиваться на скорость - пишет на языках с GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 11:36 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Пётр СедовMasterZivкто знает что куда портируют?Я знаю, что серьёзные программы повсеместно используют динамическое распределение памяти, поэтому портировать их на embedded платформы без heap-а никто не будет. Очень странное определение "серьёзные программы". Давай вкратце: ты неправ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 11:56 |
|
||
|
Почему крашится при выходе из функции?
|
|||
|---|---|---|---|
|
#18+
Да спор ни о чем. Сравнение крокодилов и остановок. Функции с размером буфера предназначены для защиты готовых программ от кулхацкеров. А функции которые сами выделяют нужный буфер - для облегчения работы программиста. Это два совершенно ортогональных направления и совсем не взаимоисключающих. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 17:11 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39366815&tid=2018349]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 275ms |
| total: | 415ms |

| 0 / 0 |
