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
.
Si ejecuta el programa anterior (cualquier IBM Mainframe COBOL desde COBOL II (primer compilador de IBM al estándar de 1985, probablemente también otros COBOL de IBM) el resultado es:
22/02/14 13.11.02 ¡HOLA MUNDO!
Sin embargo, si quita la línea triplemente inútil "MOVER ESPACIO A W-CUANDO SE COMPILA". (el campo tiene un valor inicial de espacio, y tiene otro contenido colocado en él en la siguiente instrucción, y se ramifica de todos modos) el programa no produce salida y en realidad Abends (U4038) (eso significa que se bloquea) con el siguiente mensaje :
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.
(el código y el texto del mensaje variarían entre los compiladores, las compensaciones dependen del compilador real utilizado y las opciones de compilación, la dirección depende de dónde se carga el programa cuando se ejecuta).
El motivo es el NEXT SENTENCE
. Se trata de una Secret GO TO
. El compilador busca el siguiente punto / punto completo en la fuente y genera una rama a la siguiente instrucción. Desde COBOL II, el uso de paradas completas / períodos fue relajado. Un programa debe terminar con un punto / punto completo. En este caso, la rama está fuera del final del programa.
Ambos programas compilan 100% limpio (sin mensajes de diagnóstico, código de retorno de cero).
Este comportamiento es una tonta "Extensión de IBM" para COBOL. El estándar de 1985 no permite NEXT SENTENCE
dentro de IF
/ END-IF
( CONTINUE
se usa en su lugar, que es un no-op). IBM lo permitió, causando horribles Gotchas de vez en cuando.