Доступ к архиву

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Переполнение стека, или "почему нельзя возвращать массивы" [копипаст]

Статус
В этой теме нельзя размещать новые ответы.

mendes_art

Изучающий
Пользователь
Регистрация
8 Июн 2011
Сообщения
185
Лучшие ответы
0
Репутация
55
Здравствуйте

Решил прервать давний холивар, суть которого заключается в том, можно ли возвращать в PAWN строки, или нет
В PAWN изначальный размер стека (STK) - 16384 байт, не больше, не меньше
при выполнении кода, в стек загружается информация о текущем паблике: его индекс, аргументы, кол-во аргументов
стек очищается только после успешного выполнения паблика
посчитаем, сколько требуется паблику для успешного запуска:
Код:
4 байта - адрес паблика, извлекается через funcidx
4 байта - кол-во аргументов, извлекается через numargs
4 байта - адрес кода, откуда был вызван паблик (иначе говоря, backtrace)
0..256 байт - аргументы (макс 32), собсна читаются прямо из стека
даже если посчитать паблик с максимальным кол-вом аргументов (32), то в стеке остается:
Код:
16384 - (4 * 3) - 256 = 16116 байт
ЭТО ЖЕ МНОГО?!
НЕТ!

при создании каждой ЛОКАЛЬНОЙ переменной в стеке выделяется место под нее
например:
PHP:
new level; // -4 байта из стека
PHP:
new level[256]; // (-256 * 4) = -1024 байт из стека
PHP:
new level[256 char]; // -256 байт из стека
PHP:
new level[2048]; // -8192 байт из стека (почти половина!)
А теперь, протестируем код, который возвращает массив в 2048 ячеек:
PHP:
main()
{
    new dest[2048];
    dest = get_crash();
    print(dest);
}

stock get_crash()
{
    new src[2048] = "Этот код заставит сервер вывести ошибку Runtime Error";
    return src;
}
Запустите мод с этим кодом, и вот результат:
Код:
[23:45:52] [debug] Run time error 3: "Stack/heap collision (insufficient stack size)"
[23:45:52] [debug]   Stack index (STK) is 0x13EE0, heap index (HEA) is 0x13EF4
[23:45:52] [debug] AMX backtrace:
[23:45:52] [debug] #0  00003ddc in public main () from devastation.amx
[23:45:52] Script[gamemodes/devastation.amx]: Run time error 3: "Stack/heap collision (insufficient stack size)"
Так что мой вам совет: старайтесь не возвращать строки функциями ВООБЩЕ, иначе это может привести к пагубным последствиям!

Авторские права: BJIADOKC
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу