Achtung: Dies ist eine historische Web-Site. Aktuell ist https://rainer.gerhards.net/ (engl) bzw https://www.rainer-gerhards.de/ (deutsch). Alle dynamischen Funktionen, Formulare etc auf dieser Seite sind abgeschaltet.
Datenschutzerklärung Impressum

 
01.08.2017, 22:52 Uhr
Hauptmenü
|--> Infos
|--> Forum
|--> Fotos


Sprachwahl
Sprache auswählen:




Online
Aktuell 1 Gast und 0 registrierte Benutzer online.

Anmeldung

Anmeldung




 





Neues Thema eröffnen   Neue Antwort erstellen
Vorheriges Thema anzeigen Druckerfreundliche Version Einloggen, um private Nachrichten zu lesen Nächstes Thema anzeigen
Autor Nachricht
rgerhards
Titel: Bereichsüberprüfung in Pascal  BeitragVerfasst 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
 
 Benutzer-Profile anzeigen Private Nachricht senden  
Antworten mit Zitat Nach oben
rgerhards
Titel: Bereichsüberprüfung in Turbo Pascal  BeitragVerfasst 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.
 
 Benutzer-Profile anzeigen Private Nachricht senden  
Antworten mit Zitat Nach oben
rgerhards
Titel: Bereichsüberprüfung in Free Pascal  BeitragVerfasst 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 Smile

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 Smile

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 Smile - , 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.
 
 Benutzer-Profile anzeigen Private Nachricht senden  
Antworten mit Zitat Nach oben
Beiträge vom vorherigen Thema anzeigen:     
Gehe zu:  
Alle Zeiten sind GMT + 1 Stunde
Neues Thema eröffnen   Neue Antwort erstellen
Vorheriges Thema anzeigen Druckerfreundliche Version Einloggen, um private Nachrichten zu lesen Nächstes Thema anzeigen
PNphpBB2 © 2003-2007 
:: RSS Feed: ::
Page created in 0.131248950958 seconds.

Ferientips - das Urlaubsweb - Jan Gerhards - Ulrike Gerhards - Ulrike Gerhards Foto Site