[c++] stack overflow

Pagina: 1
Acties:

  • elf
  • Registratie: December 2001
  • Laatst online: 20-05-2025
Hi allemaal,

Ik heb ff een vraagje over de stack overflow error, want ik wordt op dit moment nogal getroffen :(

in [rml][ c++] stack overflow[/rml] wordt dit door Otis gezegt:
Verwijderd schreef op 01 December 2000 @ 10:06:
Stack overflow krijg je als je in een lokaal gedefinieerd array of object loopt te poeren en dan buiten de boundaries terecht komt.
Ik vroeg me af hoe dit "poeren" eruit ziet, want ik kan me niet herrineren dat ik heb zitten poeren of lopen kloten.

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 16:17

Reptile209

- gers -

C++:
1
2
int i[2];
i[150] = 9;

Zoiets? En het wordt nog erger als die array een return-variabele is, want dan mol je je call-stack.

Zo scherp als een voetbal!


  • Psychops
  • Registratie: Februari 2001
  • Laatst online: 18-08 22:43
naja gewoon zoiets is al genoeg.

int i[10];
i[11] = 8;

*net te laat :D

[ Voor 17% gewijzigd door Psychops op 31-07-2003 17:27 ]


  • elf
  • Registratie: December 2001
  • Laatst online: 20-05-2025
maar bij mij gaat het fout op het moment dat ik een object toe voeg aan een vector. Hoe kan het daar fout gaan dan?

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 16:17

Reptile209

- gers -

Dat komt door regel 5 in de code die je hieronder mag posten ;)

Zo scherp als een voetbal!


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
elf schreef op 31 July 2003 @ 17:32:
maar bij mij gaat het fout op het moment dat ik een object toe voeg aan een vector. Hoe kan het daar fout gaan dan?
code:
1
2
3
std::vector<int> v;
v.reserve(3);
v[0]=1;

Dat moet zijn:
code:
1
2
3
std::vector<int> v;
v.resize(3);
v[0]=1;

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik wil ook wel zo'n bol als jij :o .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Meest voorkomende reden van stack overflows is foute recursie (oneindige recursie to be more specific).

Check je stack traces.

[ Voor 5% gewijzigd door curry684 op 31-07-2003 18:17 ]

Professionele website nodig?


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Stack overflow = de stack is te groot geworden om in het geheugen te houden
Buffer overflow = schrijven buiten array boundaries.

Die twee dingen zijn verschillend maar worden in deze thread als ongeveer hetzelfde gezien.. Ze zijn echter anders en hebben ook andere oorzaken, stack overflow krijg je in de praktijk alleen door fout recursie gebruik zoals curry al zei, of door enorme locale arrays maar die moet je zowieso niet hebben (gebruik dynamisch gealloceerd geheugen). Buffer overflow is het overschrijven van arrays e.d. buiten de grenzen, hiervan staan al voorbeelden in de thread. Die kunnen volgens mij niet eens stack overflows genereren (iig niet met x86).

www.madwizard.org


Verwijderd

een stack wordt gebruikt wanneer er een functie wordt opgeroepen, de vorige plaats van de pointer in te bewaren in de stack (van het index register+ de verplaatsing), als je dus een oneindige functie aanroep hebt (oneindige recursie) heeft die stack overflow als gevolg
dacht ik te hebben geleerd uit mijn assembler :-)

goed geleerd, nu vraag ik me alleen nog af wat dit toevoegt aan het topic :z

[ Voor 16% gewijzigd door curry684 op 31-07-2003 23:22 ]


Verwijderd

In het kort gezegd, een stack overflow treed op, wanneer er in je code wordt verzocht om bijvoorbeeld op positie 11 in een array gegevens te plaatsen, terwijl de array die je aan hebt gemaakt maar maximaal 10 posities mag bevatten.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 31 July 2003 @ 23:52:
In het kort gezegd, een stack overflow treed op, wanneer er in je code wordt verzocht om bijvoorbeeld op positie 11 in een array gegevens te plaatsen, terwijl de array die je aan hebt gemaakt maar maximaal 10 posities mag bevatten.
Dat is dus een buffer overflow :z

Professionele website nodig?


  • elf
  • Registratie: December 2001
  • Laatst online: 20-05-2025
Verwijderd schreef op 31 July 2003 @ 23:19:
<span style="color:blue">goed geleerd, nu vraag ik me alleen nog af wat dit toevoegt aan het topic :z</span>
dit is een duidelijk uitleg die ik wel ff nodig had:) TY SO MUCH

Thanx allemaal btw voor jullie oneindige wijsheid!!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

* curry684 vraagt zich af of je de volgende keer dan de vraag ietwat duidelijker kunt stellen, dit hadden meer mensen hier je uit kunnen leggen :)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

madwizard schreef op 31 July 2003 @ 21:32:
Buffer overflow is het overschrijven van arrays e.d. buiten de grenzen, hiervan staan al voorbeelden in de thread. Die kunnen volgens mij niet eens stack overflows genereren (iig niet met x86).
wel door stack corruption natuurlijk, wat kan optreden als je buiten je locale array schrijft. Aan het eind wordt de oude waarde van ebp van de stack gehaald, en in het eind van de aanroepende functie wordt esp=ebp. Als je buiten je array schrijft kun je de waarde van ebp dus overschrijven, waardoor een stack-overflow kan optreden aan het eind van de aanroepende functie. :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

.oisyn schreef op 01 August 2003 @ 12:21:
[...]
wel door stack corruption natuurlijk, wat kan optreden als je buiten je locale array schrijft. Aan het eind wordt de oude waarde van ebp van de stack gehaald, en in het eind van de aanroepende functie wordt esp=ebp. Als je buiten je array schrijft kun je de waarde van ebp dus overschrijven, waardoor een stack-overflow kan optreden aan het eind van de aanroepende functie. :)
Ja daar heb je gelijk in ja... Hoewel dan zelfs de kans op een stack overflow nog vrij klein is, ik geloof dat windows altijd 1 guard page heeft net onder de huidige stack, en dat zodra die gebruikt gaat worden gecommit wordt (page fault -> page commit). Stack overflow wordt herkend (iig op NT) door een page fault in de guard page wanneer de maximum stackgrootte al is bereikt.. Dat betekend ten eerste dat het geheugen adres dat de stack overflow genereert al precies in de guard page moet liggen (wat gewoonlijk ook zo is maar vrij onwaarschijnlijk dat je precies zo'n adres krijgt bij een buffer overflow). Ten tweede moet de stack ook per se in blokken van 4kb (1 page dus) groeien omdat anders de guard page niet geactiveerd wordt en windows niet ziet dat er meer stack nodig is (zie ook Q100775). De enige manier om een stack overflow te krijgen is dus de stack helemaal vol maken in stappen van 4kb (naja alleen een geheugenadres per page aanraken is genoeg natuurlijk), totdat ie vol zit.. En ja dat is mogelijk met een buffer overflow maar de kans dat dat gebeurt is wel heel erg klein ;).

www.madwizard.org

Pagina: 1