COBOL (IBM Mainframe)
ID DIVISION.
PROGRAM-ID. USELESS.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8) VALUE SPACE.
PROCEDURE DIVISION.
IF W-WHEN-COMPILED EQUAL TO SPACE
NEXT SENTENCE
END-IF
MOVE SPACE TO W-WHEN-COMPILED.
MOVE WHEN-COMPILED TO W-WHEN-COMPILED
DISPLAY W-WHEN-COMPILED " HELLO WORLD!"
GOBACK
.
Wenn Sie das obige Programm ausführen (jedes IBM Mainframe COBOL seit COBOL II (erster IBM Compiler bis 1985, wahrscheinlich auch andere IBM COBOLs), lautet die Ausgabe:
22.02.14 13.11.02 HALLO WELT!
Entfernen Sie jedoch die dreifach nutzlose Zeile "MOVE SPACE TO W-WHEN-COMPILED". (Das Feld hat einen Anfangswert für Leerzeichen, und in der nächsten Anweisung ist anderer Inhalt enthalten, und es wird trotzdem verzweigt.) Das Programm gibt keine Ausgabe aus und beendet (U4038) (dh es stürzt ab) mit der folgenden Meldung :
IGZ0037S The flow of control in program USELESS proceeded beyond the
last line of the program. From compile unit USELESS at entry
point USELESS at compile unit offset +000003AC at entry offset
+000003AC at address 119003AC.
(Der Nachrichtencode und der Text variieren zwischen den Compilern. Die Offsets hängen vom tatsächlich verwendeten Compiler und den Kompilierungsoptionen ab. Die Adresse hängt davon ab, wo das Programm beim Ausführen geladen wird.)
Der Grund ist der NEXT SENTENCE
. Das ist ein Secret GO TO
. Der Compiler sucht den nächsten Punkt in der Quelle und generiert eine Verzweigung zur folgenden Anweisung. Ab COBOL II wurde die Verwendung von Punkt / Periode gelockert. Ein Programm muss mit einem Punkt enden. In diesem Fall befindet sich der Zweig außerhalb des Programmendes.
Beide Programme kompilieren 100% sauber (keine Diagnosemeldungen, Return Code von Null).
Dieses Verhalten ist eine dumme "IBM-Erweiterung" für COBOL. Die 1985 Norm erlaubt es nicht , NEXT SENTENCE
innerhalb IF
/ END-IF
( CONTINUE
anstelle verwendet wird, die ein no-op ist). IBM erlaubte es - und verursachte von Zeit zu Zeit schreckliche Fallstricke.