![]() |
Показать все 10 сообщений этой темы на одной странице |
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Очередной бред ХЛ со строками (https://hlfx.ru/forum/showthread.php?threadid=4438)
Очередной бред ХЛ со строками
1 | char szSound[64];// temporary, overwritable, ALLOC_STRING copies (and spoils) it, \0 is mandatory |
2 | sprintf(szSound, "fans/fan%d.wav\0", m_sounds); |
3 | pev->noiseRunning = ALLOC_STRING(szSound); |
4 | // нормально, просто офигенно: |
5 | PRECACHE_SOUND(STRINGV(pev->noiseRunning)); |
6 |
7 | // а если от так - недозагрузка, "server failed to transmit 'sounds/'" |
8 | PRECACHE_SOUND(szSound); |
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
~ X ~
А чуть-чуть подумать?
Если звук ещё не закеширован, PRECACHE_SOUND записывает имя звука в глобальный массив sound_precache, который потом отсылается на клиент во время сигнона. И халфа запоминает именно указатель, а не копирует строку. Ты передаёшь адрес локальной переменной, и ессно, он становится инвалидным после завершения функции.
Конечно, это неправильно - вот так слепо доверять авторам модов и не копировать память. Но это и не идиотизм, с другой стороны. Это тяжкое наследие QC, где все строки маллокались в дата-секции и были статичными. Собсно, код функции PF_precache_sound в ку1 как бы намекает.
__________________
Странно, что оно вообще так не падает. Там по этому указателю что угодно может быть после уничтожения локального массива.
И кстати то, что ты там \0 в конец форматной строки добавил - никак не спасёт при переполнении и вообще не несёт смысла.
Угу, особенно если учесть, что ALLOC_STRING вообще никак исходную строку не модифицирует.
__________________
Спасибо, вобщем, я так и подумал. Всегда считал что прекеш копирует символы в свой массив строк, большой и надёжный, а в итоге... так делает только ALLOC_STRING().
FreeSlave это не то.
Вот так: три месяца не програмил - и всё. Снова начал мыслить по-человечкски.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.
Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo
~ X ~, не копирует, ибо большинство строк, используемых для прекэша - строковые литералы, существующие всё время работы программы. Их и не надо копировать. Вообще Дядя Миша же писал в своё время статью о том, как со строками работать в HL. Ты даже её читал, судя по комментам.
FreeSlave
Комментировать - не значит читать.
Знаешь, сколько нынче мимокунов развелось?
__________________
Читать - не значит помнить.
Ну фсё, значит, тему можно удалять за ненадобностью.
__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]
Удалять, чтобы через год ты забыл и кто-нибудь новую создал?
Не, пусть будет.
__________________
Временная зона GMT. Текущее время 13:55. | Показать все 10 сообщений этой темы на одной странице |
На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024