| 
| 
 
 
 
 
 
Online
 
Aktuell 1 Gast und 0 registrierte Benutzer online.Anmeldung 
 
 
 |  | 
| 
| 
 
| 
| Autor | Nachricht |  
| 
| rgerhards   |  | 
| Titel: Bereichsüberprüfung in Pascal  Verfasst am: 22.10.2008, 15:23 Uhr |  |  
| 
| 
 
 Anmeldung: 25. Sep 2006
 Beiträge: 688
 
 
 |  | 
| Die Bereichsüberprüfung dient dazu, die Einhaltung von Wertebereichen zu prüfen. Der Pascal-Standard verlangt eine solche Überprüfung. Allerdings ist sie sehr laufzeitaufwändig und daher bei vilen Pascal-Compilern standardmässig ausgeschaltet. 
 Es ist empfehlenswert, die Bereichsüberprüfung einzuschalten, gerade im Hinblick auf "Prüfungskonforme" Kompilierung. Denn man merkt sonst Bereichsüberläufe nicht, bzw. wenn es zu spät ist. Im Web-Assign erscheint dann gerne die Meldung "Ihre Einsendung ist fehlerhaft und führt zu einem Programmabsturz zur Laufzeit!".
 |  
| 
 Zuletzt bearbeitet von rgerhards am 24.10.2008, 14:07 Uhr, insgesamt ein Mal bearbeitet
 |  
 
|  |  |  
|  |  
|  |  
| 
| rgerhards   |  | 
| Titel: Bereichsüberprüfung in Turbo Pascal  Verfasst am: 24.10.2008, 14:07 Uhr |  |  
| 
| 
 
 Anmeldung: 25. Sep 2006
 Beiträge: 688
 
 
 |  | 
| In Turbo Pascal kann man Bereichsüberprüfungen wie folgt einschalten: 
 
 Um die Bereichsüberprüfung einzuschalten, muss man bei Turbo Pascal das "Options" Menü aufrufen und dort dann "Compiler". Darin dann die Option "Range Checking" (mit Enter zwischen Off/On wechseln). Anschließend mit 1 Mal ESC zurück und dann "Save Options". Vergisst man letzters, ist die Bereichsüberprüfung beim nächsten Start von Turbo Pascal wieder abgeschaltet.
 
 Dazu gibt es auch noch einen nützlichen Hinweis von Dietmar Reher:
 
 Dietmar Reher hat folgendes geschrieben:: 
Es gibt noch eine andere Möglichkeit um geziehlt Compiler Direktiven
 zu setzen nämlich durch einträge im Quellcode. ZB: Range-checking
 wird durch {$R+} eingeschaltet und durch {$R-} abgeschaltet. Desgl.
 für Boolean evaluation: {$B+} ein und {$B-} aus. Es gibt noch viele
 andere derartige Direktiven. Diese Methode hat den Vorteil, dass man
 sicher ist, dass die Direktive ein- oder ausgeschaltet ist - und man kann
 das ganz individuell für jedes Programm einzeln regeln - und an der
 Stelle im Programm, wo man es gerne hätte.
 
 |  
|  |  
 
|  |  |  
|  |  
|  |  
| 
| rgerhards   |  | 
| Titel: Bereichsüberprüfung in Free Pascal  Verfasst am: 24.10.2008, 20:07 Uhr |  |  
| 
| 
 
 Anmeldung: 25. Sep 2006
 Beiträge: 688
 
 
 |  | 
| Thomas Polnik hat hierzu einen sehr schönen Post geschrieben, den ich hier mit seiner Genehmigung wiedergebe: 
 Ich nutze unter eeebuntu fpc 2.2.0, unter Debian sollte die gleiche
 Version zur Verfügung stehen.
 
 Beispiel:
 $ cat test.pas
 program test(input, output);
 
 const
 BORDER=10;
 
 type
 tIndex=1..BORDER;
 var
 MyArray : array [tIndex] of integer;
 i: tIndex;
 
 begin
 {MyArray initialisieren}
 for i:=1 to BORDER do
 MyArray[i]:=i;
 
 {Bereichsueberschreitung beim Lesen provozieren}
 {Wer mutig ist und bereit ist, dies auf eigene Gefahr zu tun, kann ja
 auch eine Bereichsueberschreitung beim Schreiben in MyArray austesten.}
 
 for i:=1 to 11 do
 writeln(MyArray[i]);
 
 end.
 
 Jetzt test.pas _ohne_ range check übersetzen:
 $ fpc test.pas ; ./test
 Free Pascal Compiler version 2.2.0 [2008/04/01] for i386
 Copyright (c) 1993-2007 by Florian Klaempfl
 Target OS: Linux for i386
 Compiling test.pas
 test.pas(20,13) Warning: range check error while evaluating constants
 Linking test
 24 lines compiled, 0.2 sec
 1 warning(s) issued
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 Bei der Übersetzung wird auf die offensichtliche Bereichsüberschreitung
 hingewiesen, aber lediglich als Warnung. Es wird ein lauffähiges
 Programm erzeugt und ein Wert für myArray[11] aus den Hut gezaubert.
 Wenn man statt 11 z.B. 100 nimmt, kommen viele "lustige" Zahlen
   
 Wenn man hingegen fpc die Option -Cr mit auf den Weg gibt, dann passiert
 folgendes:
 $ fpc -Cr test.pas
 Free Pascal Compiler version 2.2.0 [2008/04/01] for i386
 Copyright (c) 1993-2007 by Florian Klaempfl
 Target OS: Linux for i386
 Compiling test.pas
 test.pas(20,13) Error: range check error while evaluating constants
 test.pas(25) Fatal: There were 1 errors compiling module, stopping
 Fatal: Compilation aborted
 Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not
 specify a source file to be compiled)
 
 Die Warnung wird zum Fehler, fpc weigert sich, das Programm zu übersetzen.
 
 Nun sollte bitte keiner den Schluß ziehen "Wenn fpc keinen Fehler range
 check error meldet, dann ist in dieser Sicht das Programm fehlerfrei."
 Obige provozierte Bereichsüberschreitung ist relativ einfach für den
 Compiler zu entdecken. Bei folgendem Beispiel kommt es ebenfalls zu
 einer Bereichsüberschreitung, der bei der Übersetzung nicht erkanntt wird.
 
 3$ cat test.pas
 program test(input, output);
 
 const
 BORDER=10;
 
 type
 tIndex=1..BORDER;
 var
 MyArray : array [tIndex] of integer;
 i: tIndex;
 j: tIndex;
 
 begin
 {MyArray initialisieren}
 for i:=1 to BORDER do
 MyArray[i]:=i;
 
 {Bereichsueberschreitung beim Lesen provozieren}
 {Wer mutig ist und bereit ist, dies auf eigene Gefahr zu tun, kann ja
 auch eine Bereichsueberschreitung bei Schreiben in MyArray austesten.}
 
 j:=10;
 for i:=1 to (j+j) do
 writeln(MyArray[i]);
 
 end.
 
 Und jetzt noch das Programm übersetzen:
 $ fpc -Cr test.pas
 Free Pascal Compiler version 2.2.0 [2008/04/01] for i386
 Copyright (c) 1993-2007 by Florian Klaempfl
 Target OS: Linux for i386
 Compiling test.pas
 Linking test
 26 lines compiled, 0.2 sec
 
 Keine Fehlermeldung trotz Option -Cr
   
 Und jetzt der Lauftest:
 $ ./test
 Runtime error 201 at $080480F9
 $080480F9
 $0805EE11
 
 
 -Cr sorgt also nebenbei  auch dafür, daß zur Laufzeit
 Bereichsüberschreitungen erkannt werden und das Programm abbricht.
 
 Ohne -Cr sieht das Ergebnis wie folgt aus:
 $ ./test
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 2571
 0
 0
 0
 0
 0
 0
 0
 0
 0
 
 -Cr ist also ein muß für alle - Zumindestens für die, die hin und wieder
 fehlerhafte Programme schreiben
  - , die den fpc nutzen. Wenn man lesend Bereiche überschreitet, ist dies "nicht weiter tragisch", doch
 wenn man schreibend unterwegs ist, kann es evtl. zu einem nicht
 gewünschten Absturz des Systems kommen.
 
 
 Viele Grüße,
 thomas p.
 |  
|  |  
 
|  |  |  
|  |  
|  |  
|  |  |  |  |  |  |