INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Bereichsüberschreitung ?
24.08.2016, 21:27
Beitrag #1
Bereichsüberschreitung ?
Was passiert in einem Atmega mit folgendem Code ?
Code:
void test() {
    int a[8];
    a[8] = 123;
}
Auf dem PC würde da ein SIGSEV oder was ähnliches kommen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2016, 21:48
Beitrag #2
RE: Bereichsüberschreitung ?
Du sprichst mit a[8] zunächst mal ein Array an.
Ich geh davon aus, das dies zuvor ordnungsgemäß angelegt wurde.

Es wurde INT gewählt, dessen Wertebereich liegt zwischen -32786 und 32786 oder ähnlich
Der Wert (123) liegt also IM Wertebereich und alles ist gut!


Um weitere Fragen zu beantworten:

Kommt es zur Überschreitung eines Wertebereichs, geht der Prozessor einfach "auf die andere Seite"
Nehmen wir an, der Bereich geht von -1000 bis 1000

X=1000;
X=X+ 100;

X ist jetzt nicht 1100 sondern -900


Das ist ziemlich tückisch, wenn man eigentlich einen Overflow erwartet...
Vor allem bei irgendwelchen Zwischenergebnissen innerhalb einer Formel, haut es plötzlich voll daneben Smile


Hier muss man die Variablen vorher örtlich umwandeln in solche, die einen größeren Wertebereich zulassen.
Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2016, 22:03
Beitrag #3
RE: Bereichsüberschreitung ?
(24.08.2016 21:48)Binatone schrieb:  Du sprichst mit a[8] zunächst mal ein Array an.
Ich geh davon aus, das dies zuvor ordnungsgemäß angelegt wurde.

Es wurde INT gewählt, dessen Wertebereich liegt zwischen -32786 und 32786 oder ähnlich
Der Wert (123) liegt also IM Wertebereich und alles ist gut!


Um weitere Fragen zu beantworten:

Kommt es zur Überschreitung eines Wertebereichs, geht der Prozessor einfach "auf die andere Seite"
Nehmen wir an, der Bereich geht von -1000 bis 1000

X=1000;
X=X+ 100;

X ist jetzt nicht 1100 sondern -900


Das ist ziemlich tückisch, wenn man eigentlich einen Overflow erwartet...
Vor allem bei irgendwelchen Zwischenergebnissen innerhalb einer Formel, haut es plötzlich voll daneben Smile


Hier muss man die Variablen vorher örtlich umwandeln in solche, die einen größeren Wertebereich zulassen.
Binatone

nein, es ist leider nicht alles gut,
bei einem int[8] ist der index von 0-7, ein index von 8 liegt jenseits des deklarierten bereichs.
was dann passiert dürfte davon abhängen welche weiteren deklarationen vorhanden sind.

nehmen wir an es gibt nur int[8] und es gibt noch vorhandene speicherresourcen, dann wird das programm es vermulich nicht merken, es sei denn es werden innerhalb des Blocks weitere Unterprogramme oder Blocks aufgerufen die den Stack erweitern.

nehmen wir an es gibt ein
int[8]; und ein
char[100];
dann wird int[8]=123 in den Bereich des char hineinschreiben.
ähnliches gilt wenn weitere Blocks oder Unterprogramme den Stack erweitern.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2016, 22:10
Beitrag #4
RE: Bereichsüberschreitung ?
Ahhh, ja stimmt!

So schnell kann man was übersehen!

Danke!


Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2016, 22:13 (Dieser Beitrag wurde zuletzt bearbeitet: 24.08.2016 22:19 von Pit.)
Beitrag #5
RE: Bereichsüberschreitung ?
(24.08.2016 21:27)Mathias schrieb:  Was passiert in einem Atmega mit folgendem Code ?
Code:
void test() {
    int a[8];
    a[8] = 123;
}
Auf dem PC würde da ein SIGSEV oder was ähnliches kommen.

ich denke, dass keine Schutzverletzung auftritt, da int[8] immer noch im Bereich des maximalen Stacks liegt (es sei denn, der Stack ist zufällig gerade am Ende). Auf dem PC ist der Stack erstmal default, man kann ihn aber auch manuell verändern oder sogar einen privaten Stack einführen.
Man kann im Prinzip den Stack auch sichern, z.B. wenn das Programm eine Aktion durchzuführen, die möglicherweise dazu führt, dass eine Ausnahme geworfen wird, die dann den weiteren Programmlauf unmöglich macht.
In diesem Fall kann man dann den Stack recovern um mit einer anderen Verfahrensweise weiterzumachen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.08.2016, 22:38 (Dieser Beitrag wurde zuletzt bearbeitet: 24.08.2016 22:40 von Tommy56.)
Beitrag #6
RE: Bereichsüberschreitung ?
(24.08.2016 22:13)Pit schrieb:  
(24.08.2016 21:27)Mathias schrieb:  Was passiert in einem Atmega mit folgendem Code ?
Code:
void test() {
    int a[8];
    a[8] = 123;
}
Auf dem PC würde da ein SIGSEV oder was ähnliches kommen.

ich denke, dass keine Schutzverletzung auftritt, da int[8] immer noch im Bereich des maximalen Stacks liegt (es sei denn, der Stack ist zufällig gerade am Ende). Auf dem PC ist der Stack erstmal default, man kann ihn aber auch manuell verändern oder sogar einen privaten Stack einführen.
Man kann im Prinzip den Stack auch sichern, z.B. wenn das Programm eine Aktion durchzuführen, die möglicherweise dazu führt, dass eine Ausnahme geworfen wird, die dann den weiteren Programmlauf unmöglich macht.
In diesem Fall kann man dann den Stack recovern um mit einer anderen Verfahrensweise weiterzumachen.
Auch auf dem PC dürfte kein SIGxxx auftreten.
Das hat mit dem Stack erst mal nichts zu tun.
Du schreibst einfach in einen Speicherbereich hinter Deinem Array und überschreibst das, was dort steht.

Wenn dort eine Variable oder Werte eines anderen Arrays stehen, wird das überbügelt.
Wenn da nix steht, hast Du Glück. Wenn da schon der Stack stehen würde, hast Du ganz großes Pech.
Das würde aber nur zutreffen, wenn Dein Array den höchsten Speicherbereich belegt, es keine Heap-Variablen gibt und der Stack schon so weit nach unten gewachsen ist.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.08.2016, 17:11
Beitrag #7
RE: Bereichsüberschreitung ?
Somit könnte solch ein Fehler ein komisches Verhalten des Atmega-Programmes quittieren.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.08.2016, 17:42
Beitrag #8
RE: Bereichsüberschreitung ?
Das Element a[8] gibt es doch nicht. Nur a[0].....a[7].
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste