Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Chyba v Delphi?

[img]chyba7vc.png[/img]
Chcem sa spytat kedy vznikne takato chyba v Delphi? U mna sa to stalo ked som do premennej typu record pridal dalsie dve premenne rovnakeho typu (tie dve pridane su rovnakeho typu a to array[1..(X*X)-X]of Byte). Pokial som pridal iba jednu tak sa nic nestalo ale po pridani druhej sa objavila tato chyba. Stalo sa to na zaciatku podprogramu pri jeho Begin. Do premennych sa nic nevkladalo ani sa s nimi nijako nepracovalo. Nakoniec som to vyriesil zmenou tych premennych za array[1..X-1]of Byte. Z mojho laickeho pohladu to vyzera ako keby tie dve predchadzajuce struktury boli na Delphi moc velke. Aky je vas nazor?

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Pozrel som sa do Project Options karta Linker a tam je Memory Sizes ako Min Stack Size $00004000 B a…
Andrej 15.05.2006 19:08
Andrej
IMHO to nie je 100000B ale hexadecimalne 100000, co je 1MB. Ano mozes si to zvysit (pisal som ti to…
MM.. 15.05.2006 20:06
MM..
Ja ešte doplním, že ak je program napísaný tak, že nekontroluje pretečenie zásobníka (čiže by ti nev…
msx. 15.05.2006 22:47
msx.
Nemas pravdu. To co popisujes nie je problem nedostatku zasobnika, to co popisujes je zneuzitie chyb…
MM.. 16.05.2006 11:57
MM..
vďaka tejto chybe Mal som na mysli chybu programátora, vďaka ktorej vypíše Delphi chybu, ktorú sem…
msx. 16.05.2006 13:36
msx.
To spolu nesuvisi! :-) Pri chybe o ktorej pises sa nevypise chybove hlasenie "stack overflow". Prost… poslední
MM.. 16.05.2006 13:41
MM..

Pozrel som sa do Project Options karta Linker a tam je Memory Sizes ako Min Stack Size $00004000 B a Max Stack Size $00100000 B. Takze pokial by som sa este stretol s touto chybou tak uz viem kde to mozem zmenit.

Na zaver pokial to dobre chapem tak zasobnik umoznuje prenasanie udajov medzi hlavnym programom a jeho podprogramami (procedurami a funkciami) popripade i proceduri a funkcie mozu mat vlastne proceduri a funkcie. Takze sa toto vsetko deli o zasobnik ktory ma definovanu urcitu velkost (v mojom pripade 100 000 B). Predpokladam ze by to malo fungovat tak ze pokial opustim proceduru alebo funkciu ktora mala lokalne premenne (napr. polia) tak sa zo zasobnika uvolni cast pamati ktoru zaberali?

IMHO to nie je 100000B ale hexadecimalne 100000, co je 1MB.
Ano mozes si to zvysit (pisal som ti to snad hned na zaciatku), ale nie je to rozumne (efektivita, a ak vytvaras data dynamicky tak nevies ci to pri urcitych specialnych vstupoch zas nedrbne kvoli rovnakemu problemu, apod.), pre vacsie mnozstva dat zasadne pouzivat objekty/fcie ktore pracuju s memory heap.

Ano ak opustis podprogram tak sa musi uvolnit zo zasobnika vsetko co sa na zaciatku podprogramu na zasobniku alokovalo, ptz. je nutne aby pri ukoncovani procedury bolo na vrchu zasobnika to, co pri volani procedury - navratova adresa.

Ja ešte doplním, že ak je program napísaný tak, že nekontroluje pretečenie zásobníka (čiže by ti nevypísalo túto chybu, čo si sem dal), tak to skončí spadnutím programu, pretože sa prepíše návratová adresa podprogramu. V extrémnych prípadoch sa stáva, že vďaka tejto chybe sa hacker nabúra do systému. Píšem síce, že v extrémnych prípadoch, ale tým myslím prítomnosť hackera. Ak prepíše návratovú adresu vhodnou hodnotou (vhodnou preňho), tak sa beh programu síce zrúti, ale riadenie sa korektne odovzdá systému a hacker má voľné pole pôsobnosti. Je to najčastejšia chyba v programoch, ktorá umožňuje nabúrať sytém. Takže veľký pozor na to, hlavne v programoch, ktoré bežia s najvyššími právami. Ak sa nemýlim, dokonca niektoré vírusy takto odpravia do večných lovísť mnohé z antivírov (niekde som to tuším čítal).

Takže ako má Intex vo svojom podpise na živě:;-)

Aj ten najjednoduhší program sa neskôr môže vyvinúť ako veľmi zložitý...

Nemas pravdu. To co popisujes nie je problem nedostatku zasobnika, to co popisujes je zneuzitie chyby programatora ak si nekontroluje velkost vstupu (v pascale by sa to nemalo stavat ptz. pascal interne kontroluje pristupy do pola).
priklad (C/C++):
void SpracujSlovo(char* slovo)
{
char pomocnybuffer[20];
strcpy(pomocnybuffer, slovo); - tu je bezpecnostna diera, hacker ju moze zneuzit ak vie sposobit ze "slovo" bude mat viac ako 20znakov
...
}
Nema to nic spolocne s velkostou zasobnika, ten moze byt aj milion gigabytov stale to bude derave.

Ak by bol maly zasobnik a nekontrolovalo by sa to, tak by si sa dockal pravdepodobne windows hlasky "program proved nelpatnou operaci a bude ukoncen" ptz. by sa prekrocil limit stack segmentu (CPU exception).

To spolu nesuvisi! :-)
Pri chybe o ktorej pises sa nevypise chybove hlasenie "stack overflow". Proste pises o niecom inom. Andrej len pouziva prilis vela velkych lokalnych premennych, to nie je bezpecnostna diera, (neda sa to zneuzit hackerom), je to len problem v tom ze mu nastavena velkost stacku nestaci a program je v tom momente preruseny.

Zpět do poradny Odpovědět na původní otázku Nahoru