amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Absolut einfaches Programm erzeugt GURU [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

16.02.2005, 22:16 Uhr

Amaris
Posts: 941
Nutzer
Hallo

Ich bin zur Zeit dabei C++ zu lernen. Bin allerdings wirklich noch ein
absoluter Anfänger. Ich verwende des Buch "C++ Programmieren mit einfachen Beispielen"
von Dirk Louis aus dem "Markt + Technik"-Verlag

Gerade habe ich etwas selbstständig in der "Gegend herum" programmiert
und bekomme bei meinem akutellem Programm eine Guru-Fehlermeldung !

Hier ist der Quellcode:

http://www.amaris.de.vu/kontoverw.cpp




Das Programm soll Daten von Bankkonten "verwalten".
Der Benutzer soll die Anzahl der zu erstellenden Konten eingeben können.
Danach gibt er Name, Kontonummer, Kontostand und Dispokredit ein.
Zum Schluß soll er eines der Konten auswählen können um dessen Datensatz wieder
anzuzeigen.
Er legt also z.B. drei Konten an und kann danach einen der drei
Datensätze wieder ausgeben.

Also eigentlich ein ganz primitives Programm. Ich habe aber nun tatsächlich mal
versucht drei Konten anzulegen. Beim dritten Durchlauf bekomme ich nach der
Eingabe des Namens einen GURU !

Ich verwende das SDK von OS4. Also den Compiler g++

Noch eine kleine Frage. Nach dem Guru reagiert die Shell nichtmehr.
Ich kann also das Ausgabefenster nicht mehr schließen. Gibt es eigentlich
im AmigaOS sowas wie den "Task-Manager" in Windows mit dem man abgestürzte Programme
beenden kann ?

Für ein paar Tips wäre ich dankbar.

MfG
Amaris

--

-Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM
-AmigaOne (µA1, G3), 160GB HDD, 256MB RAM

[ Dieser Beitrag wurde von Amaris am 16.02.2005 editiert. ]

[ Dieser Beitrag wurde von Amaris am 16.02.2005 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

16.02.2005, 23:39 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Hallo Amaris, wenn ich Richtig verstehe gibst du als Anzahl der Konten 3 ein und bekommst wenn du den dritten eintippst einen Guru?.

Wenn das das Problem ist, die Lösung ist ganz einfach, die indzizes gehen von 0 bis 2 (0, 1, 2), nicht von 1 bis 3, deine Eingabeschleife müsste also lauten:

code:
for (loop = 0; loop < anzahl; loop++)


bei der Ausgabe müsstest du statt "wahl" einfach "wahl-1" angeben

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 06:42 Uhr

Amaris
Posts: 941
Nutzer
Zitat:
Original von DariusBrewka:
Hallo Amaris, wenn ich Richtig verstehe gibst du als Anzahl der Konten 3 ein und bekommst wenn du den dritten eintippst einen Guru?.


Ja, richtig.


Zitat:
code:
for (loop = 0; loop < anzahl; loop++)


bei der Ausgabe müsstest du statt "wahl" einfach "wahl-1" angeben



Aaargh....verdammt. Natürlich. Hab gerade nochmal in dem oben geannten
Buch nachgesehen. Da stand sogar noch daß Zugriffe über das letzte
Element eines Arrays hinaus zu Speicherverletzungen führen.

Ja, dann ist der Fehler klar. Danke!

MfG
Amaris

--

-Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM
-AmigaOne (µA1, G3), 160GB HDD, 256MB RAM

[ Dieser Beitrag wurde von Amaris am 17.02.2005 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 13:22 Uhr

Maja
Posts: 15429
Nutzer
Zitat:
Original von Amaris:
Gibt es eigentlich im AmigaOS sowas wie den "Task-Manager" in Windows mit dem man abgestürzte Programme beenden kann ?


AmigaOS3.x verfügt nicht über Speicherschutz, weshalb es nicht möglich ist, einzelne Tasks gezielt zu beenden. In AmigaOS4 heißt der "Task-Manager" GrimReaper, was aber kein Task-Manager alá Windows ist, sondern mehr ein Error-Management.



[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 14:05 Uhr

thomas
Posts: 7717
Nutzer

Speicherschutz hat absolut nichts mit dem Beenden von Tasks zu tun.

Um einen Task sauber beenden zu können, braucht man Resource-Tracking, d.h. zusammen mit der Task-Struktur muß eine Liste mit allen allokierten Resourcen gespeichert werden, die beim Beenden des Tasks automatisch freigegeben werden.

In einem virtuellen Speichersystem, bei dem jedem Task ein eigener Adressraum zugeordnet wird, hat das Resource-Tracking einen nicht ganz so hohen Stellenwert, denn man kann einfach den Adressraum auflösen und hat damit fast alle Resourcen mit freigegeben. Jedoch gibt es immer noch Resourcen, die es nur einmal im System gibt (z.b. Hardware wie die Soundkarte). Hat ein Task solch eine Resource für sich reserviert, so muß sie zum Zeitpunkt des Beendens freigegeben werden.

Ein eigener Adressraum pro Task impliziert Speicherschutz, hat aber nichts mit Resource-Tracking zu tun. Darüberhinaus kann man Speicherschutz auch anders realisieren und mehrere Adressräume sind nicht die einzige Möglichkeit, virtuellen Speicher zu realisieren. Somit kann Speicherschutz nicht automatisch die Möglichkeit zum sauberen Beenden von Tasks bieten.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 14:15 Uhr

Amaris
Posts: 941
Nutzer
Zitat:
Original von Maja:

In AmigaOS4 heißt der "Task-Manager" GrimReaper, was aber kein Task-Manager alá Windows ist, sondern mehr ein Error-Management.



Hmmm....gibt es eigentlich irgendwie, irgendwo eine Beschreibung von OS4 ? Eine Art Online-Handbuch ?

Ich bin gerade nicht zuhause sondern schreibe von einem Computer in der Schule aus, daher kann ich im Moment keinen GrimReaper verursachen.....aber ich glaube die erscheinenten Optionen sind "Kill", "Reboot", "More" und noch irgendwas...

Ist es richtig daß "Kill" den Task beenden soll, welcher den Fehler verursacht hat ? So habe ich das zumindest gerade irgendwo beim googeln aufgeschnappt.
Wenn das so ist, funktioniert es jedenfalls nicht richtig. Nach dem Absturz meines kleinen C++-Programms habe ich auf "Kill" geklickt, aber das Ausgabefenster bzw. die Shell war immer noch da und reagierte nicht. Auch bei anderen abgestürzten Programmen war das eigentlich bisher immer so.

MfG
Amaris



--

-Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM
-AmigaOne (µA1, G3), 160GB HDD, 256MB RAM

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 14:38 Uhr

thomas
Posts: 7717
Nutzer

Das Fenster gehört ja nicht zur Task. Der "Kill"-Knopf entfernt nur die Task, so wie es exec.library/RemTask() machen würde. Wie gesagt, um auch die Resourcen freizugeben, braucht man Resource-Tracking. Das ist bereits implementiert, wird aber vom System noch nicht benutzt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 17:14 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Speicherschutz hat absolut nichts mit dem Beenden von Tasks zu tun.

Es gibt schon einen signifikanten Zusammenhang: wenn Du nicht weißt, was der abstürzende Task alles zerstört hat, weißt Du auch nicht, was alles beendet/neugestartet werden muß, um wieder einen stabilen Zustand zu erreichen.
Im Zweifelsfall hilft nur kompletter Neustart.
Zitat:
Ein eigener Adressraum pro Task impliziert Speicherschutz, hat aber nichts mit Resource-Tracking zu tun. Darüberhinaus kann man Speicherschutz auch anders realisieren und mehrere Adressräume sind nicht die einzige Möglichkeit, virtuellen Speicher zu realisieren.
Niemand hat gesagt, daß Speicherschutz über einen eigenen Adressraum realisiert sein muß. Lies ruhig nochmal nach. Alles, was gesagt wurde, ist, daß man unter AOS4 nicht abgestürzte Programme in der gleichen Weise wie im Windows-Taskmanager beenden kann.
Das liegt eben auch an dem fehlenden Speicherschutz. Denn ein abstürzendes Programm kann unter AmigaOS wesentlich mehr anrichten als in einem System mit Speicherschutz. Zum Beispiel Resourcen, die nicht belegt wurden und deshalb auch nicht im Tracking erfaßt sind, nachhaltig stören. Oder andere Programme, die selbst Resourcen belegt haben.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ Dieser Beitrag wurde von Holger am 17.02.2005 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.02.2005, 17:51 Uhr

thomas
Posts: 7717
Nutzer
Ach Leute, lest doch mal, was ich wirklich schreibe. Es gibt doch überhaupt nicht darum, wie man Speicherschutz realisiert. Es geht mir einzig darum, daß man keinen Speicherschutz braucht, um einen Task zu beenden.

Was Amaris möchte, ist ein Taskmanager wie bei Windows, wo man einen Task auswählen kann, auf "Beenden" klicken und wie von Geisterhand gehen alle Fenster dieses Tasks zu und alle Dateien werden geschlossen usw.

Dafür braucht man keinen Speicherschutz. Dafür braucht man allein Resource-Tracking.

Klar, daß ein Programm ohne Speicherschutz mehr kaputt machen kann, als mit. Aber was kaputt ist, ist kaputt, da wird auch Windows o.ä. nichts reparieren. Es passiert auch bei Windows oft genug, daß trotz "Task beenden" z.B. die Soundkarte nicht aufhört ein bestimmtes Sample immer und immer wieder abzuspielen und für andere Programme gesperrt ist.

Wenn ein Task eine Resource benutzt, die nicht im Resource-Tracking nicht eingetragen ist, wird sie bei "Task beenden" auch nicht freigegeben, Speicherschutz hin oder her.

Ich finde es unmöglich, daß alles, was im AmigaOS nicht möglich ist, auf den fehlenden Speicherschutz geschoben wird und daß alle guten Sachen angeblich nur mit Speicherschutz möglich sind. Das stimmt schlicht und einfach nicht.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ Dieser Beitrag wurde von thomas am 17.02.2005 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.02.2005, 00:12 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
@thomas

sehe ich genauso, aber wo wir beim Thema sind, lässt sich RT nicht einfach realisieren indem man alle Allokationen und Deallokationen dahingehend Patcht dass alles was bis dahin Angefordert wurde in umgekhrter Reihenfolge freigegeben wird?. Jedenfalls macht man das im Programm auch so.

[ - Antworten - Zitieren - Direktlink - ]

18.02.2005, 08:39 Uhr

thomas
Posts: 7717
Nutzer

Vermutlich ginge das. Man muß nur aufpassen, wenn sich die Funktionen gegenseitig aufrufen. Z.B. werden OpenScreen und OpenWindow ja auch AllocMem aufrufen, dann darf AllockMem nicht "getrackt" werden. Wenn es vom Anwendungsprogramm aufgerufen wird, schon.

Wie gesagt, bei OS4 gibt es die Funktionen zum Resource-Tracking schon. Nur die System-Funktionen sind bisher noch nicht angepaßt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

18.02.2005, 09:37 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Holger:

Niemand hat gesagt, daß Speicherschutz über einen eigenen Adressraum realisiert sein muß.


Das interessiert mich jetzt aber. Wie denn dann? (Außer über Segmente, die, wenn ich mich recht erinnere, aber weder 68k noch PPC haben.)

[ - Antworten - Zitieren - Direktlink - ]

18.02.2005, 19:06 Uhr

Amaris
Posts: 941
Nutzer
Verdammt...

ich habe wieder ein Problem.

Ich bin in dem oben genannten C++-Buch nun beim Kapitel der
objektorientierten Programmierung angelangt und habe ein kleines
Beispielprogramm aus dem Buch abgetippt.

Hier der Quelltext:

http://www.amaris.de.vu/class.cpp



Allerdings bekomme ich schon beim Kompilieren einen Gream Reaper !

Folgendes:

Guru Meditation: 80000003
Task 0x2117ea8 ("gcc:linexec/gcc/ppc-amigaos/3.4.2/cclplus")
generated an error of type DSI
on address 0x12139ec
Redzone was damaged
Stackpointer is out of bounds


Ich habe mal die Main-Funktion leer gelassen und nur die Definition
der Klasse stehen gelassen. Dann kommt kein Fehler und das Programm
wird korrekt kompiliert.

Was das nun wieder...


EDIT / NACHTRAG:

Ich hab gerade mal ausprobiert welche Code-Zeile den Fehler auslöst.
Habe in der Main-Funktion immer eine Zeile mehr dazugeschrieben und
dann wieder kompiliert. Bis zurr Zeile v1.addieren(v2) funktionierte
es. Sobald ich aber die cout-Zeile eingefügt habe, bekam ich beim
Kompilieren den besagten Fehler !



--

-Amiga 1200 + Blizzard 1230 IV, 120MB HDD, externes CD-ROM
-AmigaOne (µA1, G3), 160GB HDD, 256MB RAM

[ Dieser Beitrag wurde von Amaris am 18.02.2005 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

18.02.2005, 19:38 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Stackpointer is out of bounds

Mach einfach den Stack größer. GCC braucht eine ganze Menge. Nimm 100000 oder so.

Gruß Thomas
--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

18.02.2005, 20:30 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von DariusBrewka:
sehe ich genauso, aber wo wir beim Thema sind, lässt sich RT nicht einfach realisieren indem man alle Allokationen und Deallokationen dahingehend Patcht dass alles was bis dahin Angefordert wurde in umgekhrter Reihenfolge freigegeben wird?. Jedenfalls macht man das im Programm auch so.

Nicht jedes Programm gibt alles in umgekehrter Reihenfolge frei.
Es gibt sogar ganz normale Szenarien, in denen das nicht so abläuft

  • LockPubScreen
  • OpenWindow
  • UnlockPubScreen
    ...
  • CloseWindow

    mfg
    --
    Good coders do not comment. What was hard to write should be hard to read too.

    [ - Antworten - Zitieren - Direktlink - ]

  • 18.02.2005, 20:35 Uhr

    Holger
    Posts: 8116
    Nutzer
    Zitat:
    Original von Solar:
    Das interessiert mich jetzt aber. Wie denn dann? (Außer über Segmente, die, wenn ich mich recht erinnere, aber weder 68k noch PPC haben.)

    Wie wärs z.B. mit Code-Verification?
    Außerdem ist eigener Adressraum nicht gleichzusetzen mit eigenen Speicherbereich. An welcher logischen Adresse der erlaubte oder nicht erlaubte Speicherbereich aus Sicht der Anwendung liegt, ist doch egal.

    mfg
    --
    Good coders do not comment. What was hard to write should be hard to read too.

    [ - Antworten - Zitieren - Direktlink - ]

    18.02.2005, 20:46 Uhr

    DariusBrewka
    Posts: 899
    [Benutzer gesperrt]
    Vor einiger Zeit war in der C't ein Artikel über Stack Überlauf Viren, soweit ich es Richtig verstanden habe, werden diese sogar durch getrennte Speicherbereiche bevorzugt oder?


    [ - Antworten - Zitieren - Direktlink - ]

    19.02.2005, 14:02 Uhr

    Holger
    Posts: 8116
    Nutzer
    Zitat:
    Original von DariusBrewka:
    Vor einiger Zeit war in der C't ein Artikel über Stack Überlauf Viren, soweit ich es Richtig verstanden habe, werden diese sogar durch getrennte Speicherbereiche bevorzugt oder?

    Nicht die Trennung, sondern die logische Adressierung, die dem Programm immer die gleichen Adressräume für Heap und Stack zuweist, macht die Sache einfacher.
    Die Betonung liegt aber auf _einfacher_, nicht bevorzugt oder gar erst möglich. In anderen Worten, auch wenn der Stack und Heap-Speicherbereich nicht an konstanten Adressen liegen, ist ein solcher Exploit möglich und auch nicht wesentlich schwerer zu realisieren, wenn das Programm Überläufe zuläßt.
    Wie schon aus alten Action-Replay Tagen bekannt ist, haben selbst theoretisch im Speicher verschiebbare Programme oft die gleichen Variablen-Adressen, weil die Startbedingungen auch oft gleich sind.

    mfg
    --
    Good coders do not comment. What was hard to write should be hard to read too.

    [ Dieser Beitrag wurde von Holger am 19.02.2005 editiert. ]

    [ - Antworten - Zitieren - Direktlink - ]

    19.02.2005, 19:23 Uhr

    DariusBrewka
    Posts: 899
    [Benutzer gesperrt]
    Habe mich undeutlich ausgedrückt meinte mit getrennt, dass jedes Programm seinen eigenen Speicherbereich (virtuell) hat der von 0x0 - 0xffffffff geht und gerade weil man z.B Windows weiss das der Stack am Ende liegt kann man auf dem Stack ein Programm ablegen und irgendwo im Stack ein x0ffffff00 oder so ablegen, wo dann ein RTS eben dorthin springt. Ist das Noexecute-Feature im Athlon64 nicht gerade dafür, damit Programme im Stack nicht ablaufen können?

    Ich denke auch dass wenn die Startbedingungen gleich sind, es auch auf einem gemeinsamen (Amiga) Speicherbereich möglich ist, solche exploits zu erzeugen, aber ich wüsste jetzt nicht wie das gehen sollte, wenn man nicht von vornherein weiss wo z.B. der Stack abgelegt ist. Ich vermute mal beim Amiga ist das nicht vorherzusehen, wenn man weiter als bis zum eigenen Rechner denkt. Wenn ich z.B meinen Rechner resete und mir ohne Umwege die Adressen der einzelnen Apps anschaue, wird bei jedem Reset sich daran nicht viel ändern, aber wenn ich z.B. etwas in der Startup-seq ändere kann sich daran viel ändern, oder auch ein anderes Hintergrundbild etc.

    [ - Antworten - Zitieren - Direktlink - ]

    21.02.2005, 14:53 Uhr

    Holger
    Posts: 8116
    Nutzer
    Zitat:
    Original von DariusBrewka:
    Ist das Noexecute-Feature im Athlon64 nicht gerade dafür, damit Programme im Stack nicht ablaufen können?

    Ja, aber das ist trotzdem nur eine Sorte overflow-exploit. Man kann auch overflows in Heap-Variablen erzeugen, um dort Code abzulegen, der dann mit der manipulierten Rücksprungadresse angesprungen wird.
    Außerdem könnte man sich auch auf das Manipulieren von Variablen und Rücksprungadressen auf dem Stack beschränken, wenn man das Programm kennt und weiß, wo man (im nicht manipulierten Originalcode) hinspringen muß, um den gewünschten Effekt zu erhalten.
    Zitat:
    Ich denke auch dass wenn die Startbedingungen gleich sind, es auch auf einem gemeinsamen (Amiga) Speicherbereich möglich ist, solche exploits zu erzeugen, aber ich wüsste jetzt nicht wie das gehen sollte, wenn man nicht von vornherein weiss wo z.B. der Stack abgelegt ist.
    Der Punkt ist, daß man nicht unbedingt wissen muß, wo der Stack liegt. Man muß wissen, wo man hinspringen muß, um einen gewünschten Effekt zu erhalten.
    Wenn ich zum Beispiel einen Reset erzwingen will, brauche ich nur die Rücksprungadresse per exploit auf eine (feste) Adresse zu lenken und schon ist die Sache gelaufen. Wenn ich die genaue OS-Version kenne und Server teilen das i.A. freudig mit (und es gibt noch andere Möglichkeiten), habe ich Zugriff auf eine riesige Auswahl von Funktionen, die alle an festen Adressen liegen. Da i.A. Programme vor dem Rücksprung ihre geretteten Register vom Stack laden, kann ich mit nur einem Overflow die Parameter setzen und die gewünschte Funktion auswählen.
    Und wenn ich Rücksprungadressen nur teilweise überschreibe, kann ich (mit Einschränkungen) auch relative Sprünge erzielen.

    mfg
    --
    Good coders do not comment. What was hard to write should be hard to read too.

    [ - Antworten - Zitieren - Direktlink - ]


    -1- [ - Beitrag schreiben - ]


    amiga-news.de Forum > Programmierung > Absolut einfaches Programm erzeugt GURU [ - Suche - Neue Beiträge - Registrieren - Login - ]


    .
    Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
    Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
    .