shape1
shape2
shape3
shape4
shape7
shape8

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

  • Автор темы Amfy
  • Дата начала

Статус
Закрыто для дальнейших ответов.
A

Amfy

Гость
Гость
Здравствуйте.

Решил прервать давний холивар, суть которого заключается в том, можно ли возвращать в PAWN строки, или нет
В PAWN изначальный размер стека (STK) - 16384 байт, не больше, не меньше
при выполнении кода, в стек загружается информация о текущем паблике: его индекс, аргументы, кол-во аргументов
стек очищается только после успешного выполнения паблика
посчитаем, сколько требуется паблику для успешного запуска:

4 байта - адрес паблика, извлекается через funcidx
4 байта - кол-во аргументов, извлекается через numargs
4 байта - адрес кода, откуда был вызван паблик (иначе говоря, backtrace)
0..256 байт - аргументы (макс 32), собсна читаются прямо из стека

даже если посчитать паблик с максимальным кол-вом аргументов (32), то в стеке остается:

16384 - (4 * 3) - 256 = 16116 байт

ЭТО ЖЕ МНОГО?!
НЕТ!

при создании каждой ЛОКАЛЬНОЙ переменной в стеке выделяется место под нее
например:

new level; // -4 байта из стека
new level[256]; // (-256 * 4) = -1024 байт из стека
new level[256 char]; // -256 байт из стека
new level[2048]; // -8192 байт из стека (почти половина!)

А теперь, протестируем код, который возвращает массив в 2048 ячеек:

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

 
Статус
Закрыто для дальнейших ответов.