Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Stackoverflow erkennen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]
020
10.11.2005, 19:13 Uhr
typecast
aka loddab
(Operator)



Zitat:

Zitat von ~Sponge:
angenommen ich habe eine "normale Anwenung", dann kann man doch &argv benutzen

Das wäre der Stackanfang. Um zu erfahren, wie weit du gehen kannst, musst du das Ende ermitteln. Wie machst du das?



Ist das sicher, dass argv auf dem Stack liegt?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 10.11.2005 um 19:39 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
10.11.2005, 21:09 Uhr
ao

(Operator)



Zitat von typecast:
Ist das sicher, dass argv auf dem Stack liegt?

argv selber ja, denke ich. Die Strings, auf die es zeigt, nicht unbedingt, die können auch im Datensegment sein.

Theoretisch könnte argv auch in einem Register übergeben werden, aber das ist eher unwahrscheinlich, weil die Register zum Arbeiten gebraucht werden.

Also, ich würde sagen, &argv ist höchstwahrscheinlich eine Stackadresse.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
10.11.2005, 22:11 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


man kanns ja auf die ms methode machen: 2x bei verschiedenen Programmen mit Debugger (natürlich VC!) schaun ob die adressen auf den stack zeigen, wenn ja folgern das das immer so ist
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
10.11.2005, 22:42 Uhr
Spacelord
Hoffnungsloser Fall


Man könnte auch einfach SEH nutzen und die Exception abfangen.

C++:
#include <windows.h>
#include <iostream>

int aufruf=0;
void rek(int i,int j,int k,int l)
{
    ++aufruf;
    rek(i,j,k,l);
}

void exception_filter(LPEXCEPTION_POINTERS ep)
{
    std::cout<<"Hallo aus dem Handler!"<<"\nRekursionstiefe ist: "<<aufruf<<std::endl;
    if(ep->ExceptionRecord->ExceptionCode==EXCEPTION_STACK_OVERFLOW)    
        std::cout<<"Es ist ein Stack Overflow aufgetreten!"<<std::endl;

    exit(-1);
}

int main()
{
    __try
    {
        rek(1,2,3,4);
    }
    __except(exception_filter(GetExceptionInformation()),EXCEPTION_EXECUTE_HANDLER)
    {
        
    }

    return 0;
}



Oder hab ich irgendwas verpasst?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
11.11.2005, 08:53 Uhr
~Sponge
Gast



Zitat:
Ist das sicher, dass argv auf dem Stack liegt?


Ich stimme ao zu, denke dass es auf dem Stack liegt (ist ja ein normaler parameter), die eigentlichen Werte, also die Strings, die sollten auf dem Heap liegen (wobei eine normale Windowsanwendung wie es scheint immer mindestens 3 hat .. wer mir das erklären kann ..)

Habe das gestern noch mit den Stack adressen ausprobiert, das merkwürdige an der Sache war, dass je nachdem wieviel Stack ich dem Programm zur Bearbeitung zur Verfügung gestellt habe, hat das Programm immer den Stack bis auf knapp 20KB ausgenutzt, egal ob ich 10, 5 oder 2 MB Stack zur Verfügung gestellt hatte. DAS habe ich nun garnicht verstanden, werde es aber im Laufe des Tages noch mal kontrollieren, ob mir da irgendwo nen Schusselfehler passiert ist.
Der GCC stellt die Compileroption fstack-limit-register / fstack-limit-symbol zur Verfügung ... damit kann man Code vom GCC generieren lassen, der einen Stackoverflow erkennt und ein Signal aussetzt .... die Frage dabei ist, wenn ich die obere Grenze festlegen muss, dann muss ich auch die untere Wissen und die andere Frage ist, welches Signal wird gesendet SIGABRT ?

--
Es gibt 10 Arten von Leuten:
die, die das binäre System verstanden haben,
und die, die es nicht verstanden haben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
11.11.2005, 08:56 Uhr
~Sponge
Gast


jetzt hab ich den Spacelord, doch glatt vergessen..
tut mir leid
also das Problem ist, dass unter C++ error handling unterstüzt wird... unter C (bzw. B++ bzw. (A++)++ bzw. D--) nicht ... sowas wie division by zero und Speicherzugriffsfehler kann man schön mit Signalen abfangen und dann ggf. mit setjmp und langjmp das Programm retten und kontrolliert aus dem Fehler führen, nur bei dem Stackoverflow ist ja wenn der Fehler auftritt schon alles zu spät.. da gibts kein Signal mehr, es sei denn man schafft es sich selbst oder man überredet Kompiler (und ggf. das OS) dazu es für einen zumachen.

--
Es gibt 10 Arten von Leuten:
die, die das binäre System verstanden haben,
und die, die es nicht verstanden haben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
11.11.2005, 14:05 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von ~Sponge:
.....nur bei dem Stackoverflow ist ja wenn der Fehler auftritt schon alles zu spät.. da gibts kein Signal mehr, es sei denn man schafft es sich selbst oder man überredet Kompiler (und ggf. das OS) dazu es für einen zumachen.



Das ist so nicht ganz richtig.Die EXCEPTION_STACK_OVERFLOW wird geworfen wenn Windows für die vorletzte Seite des Stacks das PAGE_GUARD Flag entfernt und die reservierte Seite bereitstellt.Die letzte reservierte Seite des Stacks bekommt dann nicht mehr das Page_Guard Flag und wenn man trotz Ausnahme weiterhin Speicher auf dem Stack anfordert und dann auf die reservierte,aber nicht freigegebene Seite,zugreift gibt es ne Access Violation.Das war es dann endgültig!
Bis dahin ist aber noch lange nicht der Punkt erreicht dass man keine Fehlermeldung mehr in ne Logdatei schreiben könnte.
Solange man die Stack-Exception nicht ignoriert bleibt alles unter Kontrolle.

Und das windowseigene StructuredExceptionHandling hat nix mit den Standard C++ Exceptions zu tun.


Zitat von MSDN:

Die strukturierte Ausnahmebehandlung (SEH)
.......
Hinweis Die nachfolgenden Beiträge beschreiben die strukturierte Ausnahmebehandlung für die Programmiersprache C.
.........



MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
11.11.2005, 16:04 Uhr
Sponge



Ich danke Dir für diesen Hinweis ... davon hatte ich vorher noch garnix gehört, diese 3 Buchstaben werden sich aber sicherlich irgendwo in meinen Hirnrinden einbrennen,

ABER leider, wie du schon selbst sagtest

Zitat:
Und das windowseigene StructuredExceptionHandling

ist eine Microsoft Erfindung. So nun sollte die Bibliothek portabel bleiben (ok das wäre vielleicht noch ok, wenn es erstmal NUR für Windows laufen würde) aber zum anderen verwende ich den GCC zum kompilieren und laut MSDN

Zitat:
The try-except statement is a Microsoft extension to the C and C++ languages ...

oder hab ich da was falsch verstanden.. hatte jetzt nur kurz in die MSDN geschaut , es mit gcc und mit dem Studio probiert (Studio konnte kompilieren, gcc kannte __try nicht)

Der GCC hat aber ein flag fstack-limit-register bzw. fstack-limit-symbol, was genau das gleiche machen müsste.. ein Signal aussetzen, wenn das PAGE_Guard Flag nicht mehr gesetzt werden kann, mehr dazu steht 3 beiträge weiter oben

Dann wünsch ich an dieser Stelle schon mal an schönes Wochenende...
--
Es gibt 10 Arten von Leuten:
die, die das binäre System verstanden haben,
und die, die es nicht verstanden haben ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
11.11.2005, 16:23 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
nachdem du von Dll geredet hast bin ich davon ausgegangen dass du Windows DLL´s meinst .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
11.11.2005, 16:36 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Unter Linux z.B. heißen die auch anders

Und wenn du eine DLL unter Windows programmierst hast IMHO du so oder so keine chance die unter Linux zu benutzten es sei denn du machst ein neues entsprechendes Projket für Linux.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: