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. |
|
|
|
|
 |
|
|
|
|
|
|