Forum: Compiler & IDEs Gibt es in C einen Stackoverflow?


von Michael D. (etzen_michi)


Lesenswert?

Die Überschrift sagt so hoffe ich schon alles.

Ich habe bisher mit Assembler gearbeitet und da musste man immer 100% 
aufpassen das man immer richtig die Unterprogramme verlässt und auch das 
man alles was man auf den Stack legt wieder runter holt.

Besteht dieses Problematik bei C auch?

Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen 
damit es keinen Stackoverflow gibt?
Wie kann dieses Programm veranlassen das es sich selber verlässt und zu 
einem Programm welches z.B. dieses Programm neustartet springen?

von Karl H. (kbuchegg)


Lesenswert?

Michael Dierken schrieb:
> Die Überschrift sagt so hoffe ich schon alles.
>
> Ich habe bisher mit Assembler gearbeitet und da musste man immer 100%
> aufpassen das man immer richtig die Unterprogramme verlässt und auch das
> man alles was man auf den Stack legt wieder runter holt.
>
> Besteht dieses Problematik bei C auch?

In genau derselben Problematik gibt es das in C nicht. Der COmpiler 
führt BUch darüber wieviel er beim Betreten einer Funktion gepusht hat 
und holt wieder alles vom Stack.

> Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen
> damit es keinen Stackoverflow gibt?

Das kann das ganz von alleine

> Wie kann dieses Programm veranlassen das es sich selber verlässt und zu
> einem Programm welches z.B. dieses Programm neustartet springen?

Falscher Ansatz.
Dein C Programm besteht nicht aus Programmen, sondern aus Funktionen.
Auf deinem µC läuft nur 1 Programm.

von Kali (Gast)


Lesenswert?

>Besteht dieses Problematik bei C auch?
Ja.


>Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen
>damit es keinen Stackoverflow gibt?

Genau wie das entsprechende Assemblerprogramm. Du schreibst es ja 
selbst:
>100% aufpassen das man immer richtig die Unterprogramme verlässt und auch >das 
man alles was man auf den Stack legt wieder runter holt.
Siehe auch: Rekursion (z.B. Fibionacci -> Rekursionsabbruch)

>Wie kann dieses Programm veranlassen das es sich selber verlässt und zu
>einem Programm welches z.B. dieses Programm neustartet springen?

Funktion exit aufrufen.

Das fragliche Programm durch ein weiteres Programm aufrufen lassen. In 
diesem übergeordneten Programm das untergeordnete wieder aufrufen.

von DirkB (Gast)


Lesenswert?

Michael Dierken schrieb:
> Besteht dieses Problematik bei C auch?

Nein.
Das macht der Compiler.
In C räumt die aufrufende Funktion den Stack auf. Die weiß auch am 
besten, wieviel Paramter sie auf den Stack gepackt hat.

Und alle lokalen Variablen landen auch auf dem Stack.

Michael Dierken schrieb:
> Wenn ja wie muss ein Programm welches sich selbst aufruft ausschauen
> damit es keinen Stackoverflow gibt?

Den Stack groß genug machen :-)

von Martin (Gast)


Lesenswert?

DirkB schrieb:
> Das macht der Compiler.

Dann mußt du nur noch den Nachweis führen, daß die Aufruftiefe geeignet 
beschränkt ist.

von Christian B. (casandro)


Lesenswert?

Bedenke: lokale Variablen einer Funktion liegen auf dem Stack => Arrays 
(Strings!) wachsen entgegen. Sprich wenn Du ein zu großes Element eines 
Arrays überschreibst, überschreibst Du Stackinhalte, zum Beispiel Deine 
Rücksprungadresse.

von DirkB (Gast)


Lesenswert?

Martin schrieb:
> DirkB schrieb:
>> Das macht der Compiler.
>
> Dann mußt du nur noch den Nachweis führen, daß die Aufruftiefe geeignet
> beschränkt ist.

Die Antwort bezog sich auf den Teil der Frage, ob der Programmierer sich 
um die Stackbereinigung kümmern muss.

Auch wenn ich den Teil mit Nein beantwortet habe, bleibt das Problem des 
Stacküberlaufs.

von Christian B. (casandro)


Lesenswert?

Was meinst Du mit Stackbereinigung? Alles was der Compiler auf dem Stack 
alloziert gibt er auch wieder frei. Sonst macht der da nichts.

C ist nicht viel mehr als ein Makroassembler. C macht nur sehr wenig 
selbst.

von DirkB (Gast)


Lesenswert?

Christian Berger schrieb:
> Was meinst Du mit Stackbereinigung?  Alles was der Compiler auf dem Stack
> alloziert gibt er auch wieder frei. Sonst macht der da nichts.

Das reicht doch schon. Das ist mehr als bei Assembler.

> C ist nicht viel mehr als ein Makroassembler. C macht nur sehr wenig
> selbst.
Darum mögen wir ja auch C so gerne.

von Rolf Magnus (Gast)


Lesenswert?

Christian Berger schrieb:
> Was meinst Du mit Stackbereinigung? Alles was der Compiler auf dem Stack
> alloziert gibt er auch wieder frei.

Ja eben. Genau darum ging es doch in der  Frage.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.