COBOL (Mainframe da IBM)
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
.
Se você executar o programa acima (qualquer IBM Mainframe COBOL desde COBOL II (primeiro compilador IBM para o padrão 1985, provavelmente outros IBM COBOLs também)), a saída será:
22/02/14 13.11.02 OLÁ! MUNDO!
No entanto, se você remover a linha triplamente inútil "MOVER ESPAÇO PARA W-WHEN-COMPILED". (o campo tem um valor inicial de espaço e tem outro conteúdo nele na próxima instrução, e é ramificado de qualquer maneira) o programa não produz saída e, na verdade, é encerrado (U4038) (isso significa que ele trava) com a seguinte mensagem :
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.
(o código e o texto da mensagem variam entre os compiladores, as compensações dependem do compilador real usado e das opções de compilação; o endereço depende de onde o programa é carregado quando EXECUTADO).
O motivo é o NEXT SENTENCE
. Isto é um Secret GO TO
. O compilador procura o próximo ponto / ponto final na fonte e gera uma ramificação para a seguinte instrução. No COBOL II, o uso de pontos / períodos completos foi relaxado. Um programa deve terminar com um ponto final / período. Nesse caso, a ramificação está fora do final do programa.
Ambos os programas compilam 100% de limpeza (sem mensagens de diagnóstico, código de retorno zero).
Esse comportamento é um "IBM Extension" idiota para COBOL. O Padrão de 1985 não permite NEXT SENTENCE
dentro de IF
/ END-IF
( CONTINUE
é usado em vez disso, o que é um no-op). A IBM permitiu - causando Gotchas horríveis de tempos em tempos.