Întrebarea este motivul pentru care nu ar trebui să returnați o linie în arhiva funcțiilor numite - pro pwn - portal despre

În procesul de scriere a modului, am decis să merg la o astfel de extremă: întoarceți valoarea șirului la stoc. Acest forum are o temă de optimizare. Ei scriu că nu ar trebui să se facă și că amenință să depășească stiva. Aș dori să văd codul care poate provoca această depășire pentru a returna șirul în chiuvetă.







Tema oferă un exemplu de pseudonim al jucătorului. Am facut acest lucru:

CMD: go (playerid, params [])
pentru (noul i; i<=1000;i++)
print (Nume jucător (playerid));
tipăriți ("finalizat");
>

inventarul jucătorului (jucător)
pname nou [MAX_PLAYER_NAME];
GetPlayerName (playerid, pname, sizeof (pname));
retur pname;
>

N-am observat nimic special. Toate au funcționat corect. Deci, cum provocați o suprapunere de stivă pentru a returna un șir?

Și nu întoarceți 24 de celule, ci, de exemplu, 2048

stoc get_crash ()
new src [2048] = "Acest cod va determina serverul să emită o eroare de execuție";
retur src;
>
și conectați crashdetect.

Și da, Nick a fost mult timp primit în OnPlayerConnect și apoi apelează matricea în care este înregistrat acest porecla

Și da, Nick a fost mult timp primit în OnPlayerConnect și apoi apelează matricea în care este înregistrat acest porecla
Acest lucru este de înțeles, exemplul a fost luat din tema optimizării.

stoc get_crash ()
new src [2048] = "Acest cod va determina serverul să emită o eroare de execuție";
retur src;
>
Ei bine, de ce returnați un număr atât de mare de celule, există un astfel de lucru care va fi. Dacă nu puneți 2048, ci 128, atunci totul funcționează bine și fără erori.

Acesta este un astfel de scurgeri, dar dacă sunt mai multe dintre ele?

Ei bine, de ce returnați un număr atât de mare de celule, există un astfel de lucru care va fi. Dacă nu puneți 2048, ci 128, atunci totul funcționează bine și fără erori.

Ei bine, face acest lucru:

main ()
noul dest [4070];
NumeName ();
print (dest);
>
stoc Nume jucător ()






pname nou [MAX_PLAYER_NAME];
pname = "Azaza";
întoarcere Nume jucător;
>
Si uita-te la numărul de angajați stivă (cu excepția cazului în modul de depanare, înainte de a merge la acestea dosarul cu pawno și a construit acolo „pawn.cfg“ fișier, care a lista „-D3“ și după deja compilate).
Și după

întoarcere Nume jucător;
înlocuiți cu

retur 1;
Și privește din nou.

Odată cu revenirea unității în stivă va angaja 4105 celule (4105 * 4 = 16420 octeți) și 4130 (4130 * 4 = 16520 bytes) este deja ocupat cu o serie de întoarcere.
Asta este, dacă vă întoarceți o matrice, este în stivă are de 2 ori mai mult spațiu (creat pentru prima dată în scurgere, iar apoi, în funcție unde fluxul de apel, este rezervat la fel de mult de memorie, astfel încât rezultatul returnat a fost în cazul în care pentru a stoca).
Dacă ai de gând să faci totul în new.pwn, unde vei avea doar o matrice pe 100 mesh și de scurgere, cu o serie de 50 de celule pe care le va reveni, problemele, desigur, nu. Dar dacă aveți un mod întreg, care are deja o duzină de matrice într-unul singur pe GamModeInit și veți face mai multe întoarce. Înțelegi că stivă se va termina foarte repede


Acest lucru este de înțeles, exemplul a fost luat din tema optimizării.

Ei bine, de ce să întoarceți un număr atât de mare de celule, există un astfel de lucru?

Și da. Nu spune gop-ul până nu sari. Nevoile sunt diferite, și dacă nu ați întâlnit acest lucru cu altul - nu înseamnă că acest lucru nu poate fi

Ei bine, face acest lucru:

main ()
noul dest [4070];
NumeName ();
print (dest);
>
stoc Nume jucător ()
pname nou [MAX_PLAYER_NAME];
pname = "Azaza";
întoarcere Nume jucător;
>
Si uita-te la numărul de angajați stivă (cu excepția cazului în modul de depanare, înainte de a merge la acestea dosarul cu pawno și a construit acolo „pawn.cfg“ fișier, care a lista „-D3“ și după deja compilate).
Și după

întoarcere Nume jucător;
înlocuiți cu

retur 1;
Și privește din nou.

Odată cu revenirea unității în stivă va angaja 4105 celule (4105 * 4 = 16420 octeți) și 4130 (4130 * 4 = 16520 bytes) este deja ocupat cu o serie de întoarcere.
Asta este, dacă vă întoarceți o matrice, este în stivă are de 2 ori mai mult spațiu (creat pentru prima dată în scurgere, iar apoi, în funcție unde fluxul de apel, este rezervat la fel de mult de memorie, astfel încât rezultatul returnat a fost în cazul în care pentru a stoca).
Dacă ai de gând să faci totul în new.pwn, unde vei avea doar o matrice pe 100 mesh și de scurgere, cu o serie de 50 de celule pe care le va reveni, problemele, desigur, nu. Dar dacă aveți un mod întreg, care are deja o duzină de matrice într-unul singur pe GamModeInit și veți face mai multe întoarce. Înțelegi că stivă se va termina foarte repede

Și da. Nu spune gop-ul până nu sari. Nevoile sunt diferite, și dacă nu ați întâlnit acest lucru cu altul - nu înseamnă că acest lucru nu poate fi

Vă mulțumesc pentru răspunsul dvs. Am înțeles totul)







Trimiteți-le prietenilor: