Autor Beitrag
corgano
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 09.12.13 22:50 
wenn man in Delphi mit einem zu große Index auf ein Array zugreift.

Ich kann kein Delphi, will es nicht extra installieren, möchte es aber dennoch gerne wissen... Also ich meine: Ein Array "feld" wurde so deklariert, dass es 5 Integerwerte speichern kann. Wie was passiert in Delphi, auf des Feld mit den Index 99 zugreifen würde?

Danke!

Gruß
corgano
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mo 09.12.13 23:02 
Falls die Option aktiv ist, solle es "Fehler bei Bereichsprüfung" sein. Ansonsten eben merkwürdiges Verhalten oder eine Zugriffsverletzung.

Für diesen Beitrag haben gedankt: corgano
corgano Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 09.12.13 23:29 
Hab ich das richtig verstanden: Wenn beim Compiler die richtige Option angewählt wurde kommt "Fehler bei Bereichsprüfung" - ansonsten "Runtime Error", oder wer weiß was...

Danke!
Corgano

PS: Macht es nicht Sinn dies Option immer anzuwählen?
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 09.12.13 23:47 
Hallo,
user profile iconcorgano hat folgendes geschrieben Zum zitierten Posting springen:
Macht es nicht Sinn dies Option immer anzuwählen?

Nur während der Entwicklungsphase sollte man die Optionen Range checking (Feldgrenzen prüfen) und Overflow checking (Arithmetiküberlauf prüfen) einschalten.
Soll das Programm eine hohe Ausführungsgeschwindigkeit haben (zeitkritische Berechnungen mit Feldern u.ä.), so ist besser vor der abschließenden Compilierung die Optionen auszuschalten, da ein Programm mit den eingeschalteten Kontrollen langsamer läuft.
Allerdings darf man eben keine Feldgrenzen überschreiten.

user profile iconcorgano hat folgendes geschrieben Zum zitierten Posting springen:
Ich kann kein Delphi, will es nicht extra installieren, möchte es aber dennoch gerne wissen...

Wissensdurst ist immer schön. Aber dennoch: Wozu brauchst Du denn die Information?
Und Du willst es nicht installieren, d.h. Du hast eine Lizenz?! Warum willst Du es dann nicht versuchen? :wink:

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: corgano
corgano Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 10.12.13 07:51 
Danke, Mathematiker - hab so etwas vermutet.

Wozu? Ich habe neulich versucht jemanden auf diesen typischen Fehler beim Umgang mit Arrays hinzuweisen. In Java lautet dann die Fehlermeldung ArrayIndexOutOfBoundsException, in C# IndexOutOfRangeException - nur auf die Rückfrage "und in Delphi?" musste ich passen. Da dachte ich mir: Frag doch mal die Experten... ;)

Nochmals Danke!

PS: Hab auch gleich dabei gelernt. Wenn mir jemand jammert: "Das Programm zeigt nur Runtime Error!", dann sollte derjenige beim Compiler entsprechende Warn-/Prüfoptionen anwählen, damit es etwas verständlicher wird...
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Di 10.12.13 21:23 
Ich möchte Mathematiker in einem Punkt widersprechen: Range und Overflowchecks usw. sollten unbedingt immer eingeschaltet sein, mit einer einzigen Ausnahme: Es ist ein ansonsten schon optimierter Code, der sehr sehr zeitkritisch ist z. B. weil er in einer innersten Schleife außerordentlich oft durchlaufen wird.

Meine Begründung: Man sehe sich einmal mit dem Debugger (CPU-Fenster) an, welche Arbeit ein Konstrukt wie feld1[i].subfeld2[j].x der CPU macht. Und dann soll ja mit dem x auch noch gearbeitet werden. Da kommt es auf die mit INTEGER-Arithmetik zu erledigenden Abfrage der Grenzen für i und j nicht an. Wichtig ist allerdings eine saubere Behandlung der Exceptions. Der Gewinn an Sicherheit ist aber enorm. Es ist ja ein bekannter Virenangriff, ein Feld der Länge 10 (z. B.) anzukündigen und dann meher als 10 Zeichen zu senden. Ab dem 11. Zeichen steht dann Schade-Code.

Übrigens ist die Rakete Ariane 5 (oder 4 ?) wegen eines Zahlenüberlaufes abgestürzt.

Gruß
GueAck
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 10.12.13 23:35 
Das sind schnell mal 5-10% Geschwindigkeitsverlust, deshalb halte ich wenig davon das einfach so prophylaktisch einzuschalten. Das ist als ob du nur mit aufgeblasenem Airbag Auto fährst, weil dann im Falle eines Unfalls weniger passieren kann...

Denn es gibt ja zwei Möglichkeiten:
- Der Code ist fehlerhaft. Dann hilft auch die Exception nicht viel, denn den Fehler behebt diese nicht. Man findet den Fehler nur besser, aber dafür gibt es ja die Debug-Konfiguration, Unit-Tests usw.
- Der Code ist nicht fehlerhaft. Dann braucht man die Prüfung erst Recht nicht.

Für diesen Beitrag haben gedankt: Martok
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Mi 11.12.13 02:04 
Ich halte sehr viel davon dies alles prolyfaktisch einzuschalten.
10% Performance-Verlust interessieren mich wirklich nicht, wenn deshalb ein mal pro Jahr eine Fehlbuchung im Umfang von 0,5-2 MIO verhindert wird.
Wenn ich Performance will nehm ich Assembler. Und kenne die Risiken.

Mit einem Kunden wurde bei Überarbeitung des bestehenden Codes vertraglich exakt dies vereinbart: Einschaltung aller Compiler-Prüfungen. Wenn das bisher "meist korrekt funktionierende" Programm 5 Mal am Tag abschmiert und die Mitarbeiter sich deshalb beklagen ist das egal. Wenigstens kommt man dann endlich den Programmierfehlern der letzten 10 Jahre auf die Spur.

> Denn es gibt ja zwei Möglichkeiten:
> Der Code ist fehlerhaft.
ist er immer. zumindest meiner.
> Der Code ist nicht fehlerhaft. Dann braucht man die Prüfung erst Recht nicht.
Habe ich bisher noch nicht erlebt außer wenn er weniger als 100 Zeilen hatte.

Das ist nun nicht böse gemeint sondern Erfahrung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.12.13 07:37 
Natürlich ist jeder Code irgendwo fehlerhaft.

Aber meistens ist die Notwendigkeit für solche Compilerschalter im Release eher ein Zeichen für fehlende Unittests etc., denn gerade solche Fehler fallen dabei zu einem großen Teil auf.