AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Grenzunterschreitung bei Array[1...9] ohne Exception

Grenzunterschreitung bei Array[1...9] ohne Exception

Ein Thema von cs.rumpelstilzchen · begonnen am 6. Jul 2021 · letzter Beitrag vom 25. Jul 2021
Antwort Antwort
Benutzerbild von cs.rumpelstilzchen
cs.rumpelstilzchen

Registriert seit: 16. Sep 2004
Ort: NRW
72 Beiträge
 
Delphi XE4 Professional
 
#1

Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 15:42
Delphi-Version: XE4
Hallo Leute

Habe grad bemerkt, dass folgender Code zur Laufzeit KEINE Exception auslöst...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  aTest : Array[1..9] of Integer;
  iIdx : Integer;
begin
  iIdx := 0;
  aTest[iIdx] := 123;
end;
Wo landet denn der zugewiesene Wert???

Erst wenn ich danach lesend auf das Element zugreife, knallts:

  Label1.Caption := IntToStr(aTest[iIdx]);
Der weiß, daß er nichts weiß, wie alle anderen auch nichts wissen.
Nur weiß er, was die anderen und auch er selbst noch lernen müssen.
(Novalis 1772 - 1801)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.752 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 15:57
.. ist bei Dir range Checking - bzw. Bereichsüberprüfung in den Compliler Optionen gesetzt?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#3

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 15:57
Habe grad bemerkt, dass folgender Code zur Laufzeit KEINE Exception auslöst...
Vermutlich, weil du das Range-Checking nicht eingeschaltet hast.

Wo landet denn der zugewiesene Wert???
Damit überschreibst du den Speicherbereich vor dem Array.

Erst wenn ich danach lesend auf das Element zugreife, knallts:
Verwundert nach der vorigen Antwort aber auch nicht wirklich.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
308 Beiträge
 
Delphi 12 Athens
 
#4

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 16:28
Mir ist das erst neulich aufgefallen. Auf ein String-Array 1..9 konnte ich plötzlich mit Index 0 lesend zugreifen. Es kam ein großes "A" als Ergebnis. Keine Ahnung. Der try except - Block außenrum, der in diesem Falle früher "unbekannt" ausgegeben hatte, ist nicht angesprungen.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 23:05
Hintergrund ist, dass die Prüfung, ob die Arraygrenzen eingehalten werden, logischerweise Zeit kostet. Deshalb muss man die bereits genannte Bereichsprüfung explizit aktivieren.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.882 Beiträge
 
Delphi 12 Athens
 
#6

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 23:13
Delphi-Quellcode:
{$R+}
procedure TForm1.Button1Click(Sender: TObject);
var
  aTest : Array[1..9] of Integer;
  iIdx : Integer;
begin
  iIdx := 0;
  aTest[iIdx] := 123;
  Label1.Caption := IntToStr(aTest[iIdx]);
end;
und jetzt?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 6. Jul 2021 um 23:18 Uhr)
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
308 Beiträge
 
Delphi 12 Athens
 
#7

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 23:48
Delphi-Quellcode:
{$R+}
procedure TForm1.Button1Click(Sender: TObject);
var
  aTest : Array[1..9] of Integer;
  iIdx : Integer;
begin
  iIdx := 0;
  aTest[iIdx] := 123;
  Label1.Caption := IntToStr(aTest[iIdx]);
end;
und jetzt?
Drück mal auf Projekt > ...neu erzeugen. Dann sollte es klappen. Einfach F9 hat bei mir nicht gereicht. ????
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
308 Beiträge
 
Delphi 12 Athens
 
#8

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 6. Jul 2021, 23:52
Wenn ich in den Projektoptionen unter Erzeugen > Delphi-Compiler > Compilieren > Laufzeitfehler die "Bereichsüberprüfung" aktiviere, dann wird auch wieder eine Exception zur Laufzeit geworfen (nachdem ich das Projekt neu erzeugt habe; F9 reicht nicht). Die Option ist jetzt fett, d.h. es ist nicht der Standardwert. Ich frage mich jetzt, wer das wann verändert hat. Ich habe hier niemals an den Einstellungen rumgespielt und früher wurde die Exception definitiv geworfen.

Andersherum muss ebenfalls das Projekt neu erzeugt werden, wenn man die Option wieder deaktiviert; auch hier reicht F9 nicht aus.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.288 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 7. Jul 2021, 14:53
Andersherum muss ebenfalls das Projekt neu erzeugt werden, wenn man die Option wieder deaktiviert; auch hier reicht F9 nicht aus.
Das ist klar. Denn Units werden nur neu kompiliert, wenn sie sich geändert haben. Das ist hier ja nicht der Fall.

Schöner wäre natürlich, wenn der Compiler auch die Änderung von Projekteinstellungen berücksichtigen würde, aber ob entsprechende Einstellungen geändert wurden, kann er schlicht nicht erkennen, da es dafür keine Markierung gibt.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.882 Beiträge
 
Delphi 12 Athens
 
#10

AW: Grenzunterschreitung bei Array[1...9] ohne Exception

  Alt 25. Jul 2021, 13:17
Delphi-Quellcode:
{$R+}
procedure TForm1.Button1Click(Sender: TObject);
var
  aTest : Array[1..9] of Integer;
  iIdx : Integer;
begin
  iIdx := 0;
  aTest[iIdx] := 123;
  Label1.Caption := IntToStr(aTest[iIdx]);
end;
und jetzt?
Drück mal auf Projekt > ...neu erzeugen. Dann sollte es klappen. Einfach F9 hat bei mir nicht gereicht. ????
Du musst das Project "erzeugen". Leider ist F9 mehr so eine Zeitsparvariante von "Erzeugen".

Auf jedenfall kann ich nur davon abraten {$R+} oder RANGECHECK ON als Compiler option zu verwenden wenn das Produkt ausgeliefert wird. Es hilft aber manchmal komische Fehler im Testbetrieb zu finden.

[OT]
Wenn du ein recht aktuelles Delphi verwendest(Genereics, Classhelpers) dann kann ich dir noch folgende Unit von Github für Offene Arrays empfehlen.
https://github.com/WilliCommer/ArrayHelper

Die unit heist ArrayHelper.pas aber statt des helpers der inder Unit ist solltest du den TArrayRecord nutzen. Spart einem viel Arbeit und die Syntax sieht dann mehr Objekt orientiert aus...
Delphi-Quellcode:
var
  A: TArrayRecord<string>;
begin
  A.SetValues(['a','b','c']);
  A.Add('d');
  assert( A.Count = 4 ); // same as length(A.Items);
  assert( A[1] = 'b' );
  assert( A.IndexOf('a') = 0 );
  for S in A do
    ..
[/OT]
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz