Translate

Mostrar mensagens com a etiqueta SSRANGE. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta SSRANGE. Mostrar todas as mensagens

quinta-feira, 2 de julho de 2026

As 16 Recomendações da IBM que Todo Programador COBOL Padawan Deveria Conhecer

 

Bellacosa Mainframe e 16 recomendacoes Jedi para seu programa COBOL século XXI

☕ Um Café no Bellacosa Mainframe

As 16 Recomendações da IBM que Todo Programador COBOL Padawan Deveria Conhecer

Da Era dos Cartões Perfurados ao IBM Z Moderno: Como Escrever COBOL Preparado para os Próximos 30 Anos

"A maior diferença entre um Programador COBOL Júnior e um Arquiteto Mainframe não está em quantos comandos ele conhece, mas em entender por que a linguagem evoluiu."

Existe uma frase muito comum entre desenvolvedores iniciantes:

"Sempre fizemos assim."

Ela parece inofensiva.

Mas, no mundo Mainframe, ela pode esconder décadas de dívida técnica.

Muitos sistemas COBOL que ainda executam hoje foram escritos quando:

  • o IBM System/360 ainda era novidade;

  • cartões perfurados eram utilizados;

  • memória era medida em kilobytes;

  • não existia Internet;

  • não existia Java;

  • não existia JSON;

  • ninguém imaginava APIs REST.

Mesmo assim, esses sistemas continuam processando bilhões de dólares diariamente.

Então surge uma pergunta inevitável:

Se eles funcionam tão bem, por que a IBM continua evoluindo o COBOL?

A resposta é simples.

Porque o mundo mudou.

O hardware mudou.

Os processadores IBM Z mudaram.

O Language Environment (LE) mudou.

As aplicações passaram a conversar com Java, Python, Node.js, microsserviços, OpenShift, APIs REST e serviços em nuvem.

O COBOL também precisou evoluir.

E é exatamente isso que veremos neste café.


A filosofia da IBM

Existe um detalhe curioso.

A IBM raramente muda uma linguagem apenas porque existe uma novidade tecnológica.

Ela muda quando existe ganho real.

Os princípios normalmente são:

  • mais segurança

  • mais desempenho

  • menos CPU

  • menos manutenção

  • melhor integração

  • melhor diagnóstico

  • maior reutilização

Sempre que surgir uma recomendação da IBM, pergunte:

"Qual problema essa mudança resolveu?"

Essa pergunta transforma um Padawan em um profissional que entende arquitetura.


1. STOP RUN → GOBACK

Provavelmente a recomendação mais conhecida.

Durante décadas escrevíamos:

STOP RUN.

Hoje, novos projetos costumam utilizar:

GOBACK.

Por quê?

Imagine um restaurante.

Você pede um café.

O garçom leva até sua mesa.

Quando termina de beber, o correto é devolver a xícara ao garçom.

Não faz sentido fechar o restaurante inteiro.

Foi exatamente isso que aconteceu com o COBOL.

Nos anos 60 o programa era praticamente o dono da execução.

Hoje ele normalmente é apenas um componente.

Pode ser chamado por:

  • outro COBOL

  • CICS

  • IMS

  • Java

  • API REST

  • MQ

  • z/OS Connect

Se um módulo chamado executar STOP RUN...

Toda a Run Unit termina.

Com GOBACK...

O controle simplesmente retorna ao chamador.

Dica Bellacosa

Sempre imagine:

"Meu programa está prestando um serviço."

Quem chamou deve decidir quando terminar a aplicação.


2. NUMCHECK

Todo programador já viu um S0C7.

Normalmente ele aparece na madrugada.

Em produção.

Na sexta-feira.

O motivo quase sempre é simples.

Dados inválidos.

Exemplo:

MOVE "ABC" TO WS-VALOR.
ADD 10 TO WS-VALOR.

Visualmente parece correto.

Na prática...

Explode.

NUMCHECK faz o compilador inserir verificações para identificar esse tipo de problema antes que ele vire um incidente.

Curiosidade

Muitos S0C7 não nascem onde ocorrem.

O dado inválido pode ter sido gravado horas antes por outro programa.


3. SSRANGE

Imagine um armário com 100 gavetas.

Você tenta abrir a gaveta 101.

Ela simplesmente não existe.

Sem SSRANGE...

Seu programa pode acessar memória indevida.

Com SSRANGE...

O erro é detectado imediatamente.

Exemplo:

01 TABELA.
   05 ITEM OCCURS 100 TIMES.

MOVE "X" TO ITEM(101).

Esse erro pode permanecer escondido durante anos.

Até que um dia...

Produção.


Curiosidade

Grande parte dos erros difíceis de reproduzir está relacionada ao acesso indevido de memória.

SSRANGE ajuda justamente nisso.


4. TEST

Quantos DISPLAY você já encontrou em produção?

DISPLAY "CHEGUEI AQUI".

DISPLAY SQLCODE.

DISPLAY WS-CLIENTE.

Eles ajudam?

Sim.

Mas apenas temporariamente.

Hoje existem ferramentas de Debug muito mais completas.

Com TEST, o programa pode ser analisado sem transformar o código em uma árvore de DISPLAY.


5. Unicode

Durante décadas tudo era EBCDIC.

Hoje recebemos:

  • JSON

  • XML

  • APIs

  • Web

  • Smartphones

  • Emojis

  • Idiomas internacionais

O COBOL moderno suporta Unicode.

Isso significa muito mais integração.

Imagine um banco atendendo clientes no Japão, Brasil e Alemanha.

Tudo utilizando a mesma aplicação.


Curiosidade

Muitos desenvolvedores COBOL nunca perceberam que o Enterprise COBOL moderno possui excelente suporte a Unicode.


6. JSON PARSE

Há alguns anos montar JSON significava algo parecido com isto:

STRING "{"

...

"}"

Muito código.

Muito risco.

Muito difícil de manter.

Hoje basta utilizar:

JSON GENERATE.

Ou

JSON PARSE.

O compilador faz praticamente todo o trabalho.


Isso muda completamente a modernização

Imagine integrar COBOL com:

  • React

  • Angular

  • Flutter

  • Java

  • Python

JSON virou a linguagem universal.


7. XML PARSE

O mesmo aconteceu com XML.

Antes era comum utilizar:

UNSTRING.

INSPECT.

STRING.

Hoje o compilador entende XML nativamente.

Menos código.

Menos bugs.

Mais produtividade.


8. RENT

Talvez uma das opções menos conhecidas pelos iniciantes.

RENT significa:

Reentrant.

Ou seja...

O programa pode ser executado simultaneamente por diversos usuários.

Imagine um banco.

Cinco mil clientes consultando saldo.

O mesmo programa atende todos.

Isso só funciona porque ele foi escrito corretamente.


Dica

Sempre evite gravar informações temporárias em áreas compartilhadas.


9. DYNAM

No passado quase tudo era ligado durante o Link-Edit.

Hoje queremos mais flexibilidade.

CALL dinâmico permite substituir módulos sem reconstruir toda a aplicação.

É um grande aliado em ambientes modernos.


10. EVALUATE

Existe um momento na vida de todo Padawan em que ele escreve isto:

IF
ELSE
IF
ELSE
IF
ELSE

Depois de alguns meses...

Nem ele entende mais.

EVALUATE resolve exatamente isso.

Exemplo:

EVALUATE WS-TIPO

WHEN 1

WHEN 2

WHEN 3

WHEN OTHER

END-EVALUATE

Muito mais limpo.


11. END-IF

Antigamente muitos programas dependiam de ponto final e NEXT SENTENCE.

Isso gerava ambiguidades.

Hoje escrevemos:

IF ...

END-IF

O compilador entende exatamente onde cada bloco termina.


12. Intrinsic Functions

Durante muitos anos criávamos rotinas para tudo.

Hoje o compilador já oferece dezenas de funções.

Exemplos:

FUNCTION CURRENT-DATE

FUNCTION LENGTH

FUNCTION TRIM

FUNCTION LOWER-CASE

FUNCTION UPPER-CASE

Além de deixar o código mais elegante, elas costumam ser mais eficientes.


13. Evitar ALTER

ALTER era considerado brilhante.

Na década de 70.

Hoje virou pesadelo.

Ele altera dinamicamente o fluxo do programa.

Resultado:

  • difícil de entender;

  • difícil de depurar;

  • difícil de otimizar.

Por isso praticamente desapareceu dos novos projetos.


14. Reduzir GO TO

Existe um mito.

GO TO não é proibido.

Mas o excesso dele transforma um programa em um labirinto.

Imagine tentar seguir uma história cuja página seguinte muda aleatoriamente.

É exatamente essa sensação.

PERFORM e EVALUATE tornam o fluxo muito mais claro.


15. Migrar para Enterprise COBOL 6.x

Essa talvez seja a maior evolução dos últimos anos.

O compilador moderno entende muito melhor os processadores IBM Z atuais.

Isso significa:

  • menos CPU;

  • otimizações automáticas;

  • melhores diagnósticos;

  • suporte ampliado a JSON e XML;

  • novas funções intrínsecas.

Em muitos casos, apenas recompilar um programa com ajustes adequados já produz ganhos perceptíveis de desempenho.


16. Pensar em Integração

Esta talvez seja a maior mudança cultural.

Antes escrevíamos programas Batch.

Hoje escrevemos serviços corporativos.

Um programa COBOL pode atender:

  • Mobile Banking

  • Internet Banking

  • PIX

  • APIs REST

  • Java

  • Python

  • Node.js

  • OpenShift

  • Mensageria MQ

O código precisa nascer preparado para esse mundo.


O impacto nos programas antigos

A boa notícia é que a IBM sempre valorizou compatibilidade. Muitos programas escritos há décadas ainda compilam e executam nas versões atuais do Enterprise COBOL.

Isso, porém, não significa que estejam aproveitando os recursos modernos.

É comum encontrar aplicações com:

  • STOP RUN em todos os módulos;

  • dezenas de GO TO;

  • ALTER;

  • manipulação manual de XML e JSON;

  • ausência de verificações de dados;

  • poucas opções de diagnóstico.

Esses programas continuam funcionando, mas tendem a ser mais difíceis de manter, testar e integrar.

Modernizar não significa reescrever tudo. Em muitos casos, basta evoluir gradualmente: substituir comandos antigos, ativar opções do compilador, introduzir funções intrínsecas e organizar melhor o código.


A evolução de um Programador COBOL

Todo desenvolvedor passa por etapas.

Padawan

Aprende a sintaxe.

Consegue compilar.

Resolve problemas.

Programador

Começa a reutilizar código.

Escreve módulos.

Documenta interfaces.

Desenvolvedor Sênior

Pensa em desempenho.

CPU.

Memória.

Escalabilidade.

Arquiteto

Pensa no sistema inteiro.

Integração.

Disponibilidade.

Evolução.

Governança.

Perceba que, à medida que você cresce, a linguagem deixa de ser o foco principal. O importante passa a ser a qualidade das decisões.


O Mainframe moderno

Existe um mito antigo de que o Mainframe "parou no tempo".

Nada poderia estar mais distante da realidade.

Hoje um IBM Z pode:

  • expor APIs REST;

  • consumir serviços externos;

  • executar aplicações Java;

  • trabalhar com contêineres;

  • integrar-se ao OpenShift;

  • processar JSON e XML;

  • utilizar DevOps, Git e pipelines CI/CD;

  • compartilhar dados em tempo real com aplicações distribuídas.

O COBOL moderno acompanha essa evolução. As recomendações da IBM existem justamente para que o código continue relevante nesse novo cenário.


Conclusão

Existe uma frase que resume toda essa evolução:

"O melhor código não é aquele que apenas funciona hoje; é aquele que continuará funcionando, sendo compreendido e evoluído daqui a vinte anos."

As recomendações da IBM não representam uma ruptura com o passado. Elas representam a continuidade de uma filosofia que sempre guiou o Mainframe: estabilidade, desempenho, confiabilidade e evolução gradual.

Trocar STOP RUN por GOBACK, utilizar NUMCHECK, adotar SSRANGE nos testes, explorar JSON PARSE, JSON GENERATE, XML PARSE, RENT, funções intrínsecas e estruturas mais legíveis não é seguir uma moda. É escrever código preparado para um ambiente onde COBOL conversa diariamente com APIs, microsserviços, aplicações móveis e plataformas em nuvem.

Como Programador COBOL Padawan, seu objetivo não deve ser apenas aprender comandos. Deve ser entender por que eles existem, quando utilizá-los e como eles ajudam a construir sistemas capazes de sobreviver por décadas.

No Bellacosa Mainframe, costumamos dizer que a verdadeira modernização não começa com uma nova tecnologia. Ela começa quando o desenvolvedor muda sua forma de pensar. O compilador evolui, o hardware evolui, o IBM Z evolui — e o profissional que acompanha essa jornada deixa de apenas escrever programas para construir soluções que atravessam gerações.


sábado, 5 de abril de 2025

☕💥 Buffer Overflow, Memory Overwrite e Storage Corruption no z/OS

 

Bellacosa Mainframe e os perigos na gestão de memoria no mainframe

☕💥 Buffer Overflow, Memory Overwrite e Storage Corruption no z/OS

Ou como um simples MOVE pode transformar um datacenter multimilionário em uma sessão espírita conduzida por um Sysprog com café frio

 


Introdução

Existe uma frase antiga entre veteranos de Mainframe:

"Computadores não cometem erros. Eles apenas obedecem ordens idiotas em velocidades absurdamente altas."

E poucas coisas representam melhor isso do que três monstros ancestrais da programação:

  • Buffer Overflow

  • Memory Overwrite

  • Storage Corruption

O curioso é que muitos desenvolvedores COBOL juniores acreditam que isso é um problema de C, C++, Linux ou Windows.

Na verdade...

Mainframe conhece esses monstros desde que Elvis Presley ainda estava gravando discos.

A diferença é que o z/OS aprendeu a sobreviver a eles.

Hoje vamos entender como esses problemas surgem em:

  • COBOL

  • JCL

  • REXX

  • CICS

  • DB2

  • IMS

  • VSAM

  • Batch

  • JES2

  • SDSF

  • Language Environment

e principalmente...

como impedir que uma simples variável PIC X(10) provoque um incidente digno de abertura de War Room.


Capítulo 1

O que é Buffer Overflow?

Definição simples.

Você reservou espaço para 10.

Escreveu 100.

Fim.

Exemplo.

COBOL

01 WS-NOME.

   05 WS-TEXTO PIC X(10).



MOVE "BELLACOSA-MAINFRAME" TO WS-TEXTO

Teoricamente:

0123456789
BELLACOSA

Sobrou:

MAINFRAME

Para onde foi?

Depende.

Pode ir para:

Flag

Outra variável

LE Runtime

Heap

Stack


Linguagem C


char nome[10];

strcpy(nome,"BellacosaMainframe");

Mesmo problema.

COBOL apenas costuma esconder melhor.


Capítulo 2

Memory Overwrite

Buffer Overflow produz.

Memory Overwrite.

É o efeito colateral.


Exemplo

01 WS-AREA.

05 TABELA OCCURS 100.

10 COD PIC X.


05 FLAG PIC X.

Erro.

MOVE 'S'
TO TABELA(101)

Resultado.

FLAG = S


Pior.

Pode alterar:

SQLCA

DFHEIBLK

TGT

Save Area


Storage Corruption

É o estágio terminal.

Já não sabemos mais o que foi alterado.

O programa continua rodando.

Mas agora virou um zumbi.


O pesadelo

Job roda.

Termina RC=0000.

DB2 recebe dados errados.

VSAM inconsistente.

Extrato bancário incorreto.

E ninguém percebe.


Capítulo 3

Como o z/OS protege memória

1964

System/360

Quase nenhuma proteção.


Anos 70

Storage Keys

PSW


Anos 80

MVS/XA

Address Space


Anos 90

ESA

Cross Memory


Anos 2000

zOS

64 bits

LE

Heap protegido


Hoje

z16

z17

Guard Pages

Hardware assistido

Storage protection


O conceito de Address Space

Cada Job.

Cada TSO.

Cada CICS.

Possui seu universo.


Imagine apartamentos.

Apartamento 101.

COBOL.

Apartamento 102.

DB2.

Apartamento 103.

JES2.

Overflow.

Quebrou parede.

Invadiu apartamento vizinho.

Sysprog chora.


Capítulo 4

Batch

Batch é perigoso.

Porque roda horas.


Exemplo

5 milhões registros.

Erro.

Registro 3.456.789.

Corrupção.


Abends comuns

S0C4

Protection Exception


S0C7

Dados inválidos


S0C1

Opcode ilegal


S878

Storage


S80A

Memória insuficiente


U4038

LE detectou problema


Caso histórico

Década 90.

Seguradora.

Tabela OCCURS 500.

Nova regra.

700 elementos.

Programa não recompilado.

Sobrescreveu área.

Job fechou mensal.

Milhares apólices erradas.

Descoberta.

3 semanas depois.


Capítulo 5

CICS

No online.

Muito pior.


CICS compartilha recursos.

Tasking.

Threads.


Erro.

Pode derrubar milhares usuários.


DFHEIBLK corrompido.

Retorno errado.


Pseudo-conversacional.

COMMAREA.

Overflow.


Exemplo

DFHCOMMAREA PIC X(32767)

Recebe.

40 mil.

Boom.


Abends famosos

AEI9

ASRA

AEYD

APCT

AICA


AICA

Loop infinito.

CPU consumida.


ASRA

Equivalente S0C4.


Capítulo 6

DB2

DB2 é robusto.

Mas aplicativo não.


SQLDA.

SQLCA.

Host Variables.


Exemplo

PIC X(10)

Coluna VARCHAR(100)


Truncation.


SQLCODE

-302

-311

-305


Melhor prática.

Verificar.

SQLCODE.

Sempre.


Capítulo 7

IMS

IMS é uma máquina do tempo.

Ainda vivo.


PCB errado.

SSA inválida.

Pode gerar.

U0777


Overflow.

Área I/O.


Segmento corrompido.


Capítulo 8

VSAM

KSDS.

RRDS.

ESDS.


Erro clássico.

READ NEXT.

EOF ignorado.


Subscript inválido.


Storage corruption.


IDCAMS detecta.

VERIFY

EXAMINE


Capítulo 9

REXX

Parece inocente.

Não é.


Stem.

CLIENTE.0=100

DO I=1 TO 1000

SAY CLIENTE.I

END

Dados inexistentes.


RC inesperado.


Storage não costuma corromper.

Mas lógica.

Sim.


Capítulo 10

JES2

JES2 protege spool.


Mas programa pode gerar.

100 milhões linhas.

SYSOUT gigante.


JES2 sofre.


HASP...

mensagens.


Spool cheio.


Job cancelado.


Capítulo 11

SDSF

Melhor amigo.


ST

Status


DA

Address Spaces


LOG

Mensagens


ENC

Enclave


Examine.

MEMORY.

CPU.

Abends.


Capítulo 12

LE

Language Environment.

Herói desconhecido.


SSRANGE

CHECK

HEAPCHK

RPTSTG

TRAP

TERMTHDACT


Exemplo

PARM='TRAP(ON)'

Captura.

Stack.

Dump.


Capítulo 13

Ferramentas modernas

Fault Analyzer

Abend Aid

IBM Debug

IPDF

CEEDUMP


SMF

30

110

120


RMF


OMEGAMON


Z APM


Capítulo 14

Como programar seguro

Sempre

SSRANGE


Validar índices.

IF IDX <= MAX

Nunca confiar input.


CHECK LENGTH


SQLCODE


RESP

CICS


FILE STATUS


ON SIZE ERROR


INITIALIZE


INSPECT


TESTAR.

TESTAR.

TESTAR.


Capítulo 15

Detectando antes do caos

Pipeline ideal.

DEV

SSRANGE

QA

HEAPCHK

HML

TRAP

PRD

NOSSRANGE

SMF

OMEGAMON


Alarmes.

CPU.

Storage.

Abends.

Spool.

Response Time.


Easter Egg Bellacosa

Existe uma lenda em alguns datacenters.

Conta-se que um programa COBOL compilado em 1984 executava perfeitamente.

Até que um desenvolvedor júnior resolveu "modernizar".

Adicionou:

OCCURS 2000 TIMES

Compilou.

Promoveu.

Sexta-feira.

17h45.

Produção.

Fim de mês.

Folha salarial.

Executou.

RC=0000.

Tudo aparentemente perfeito.

Na segunda-feira descobriram que 12 mil funcionários haviam recebido exatamente:

R$ 0,01

O programa não havia abendado.

Não havia S0C4.

Não havia dump.

Apenas um discreto byte sobrescrito em uma área esquecida do Working Storage.

Dizem que o Sysprog responsável ainda hoje aparece pelos corredores do CPD segurando uma caneca de café e repetindo para novos desenvolvedores:

"Tem gente que teme IA substituir programadores. Eu temo programadores que compilam NOSSRANGE em homologação."


Conclusão

Os grandes incidentes em Mainframe raramente começam com uma pane espetacular.

Eles começam com pequenas negligências:

  • Um índice não validado;

  • Um OCCURS mal dimensionado;

  • Um SQLCODE ignorado;

  • Um COMMAREA maior que o esperado;

  • Um READ VSAM sem FILE STATUS;

  • Um JCL sem limites de espaço;

  • Um REXX assumindo que tudo sempre existe.

O z/OS evoluiu durante mais de 60 anos justamente para impedir que esses erros se transformem em catástrofes.

Mas a última linha de defesa continua sendo a mesma desde 1959:

O desenvolvedor que entende memória, respeita limites e trata cada MOVE como se estivesse carregando plutônio digital.

quinta-feira, 14 de julho de 2022

☕💥 Arrays em COBOL: O Poder Oculto do OCCURS, SSRANGE e a Guerra Contra a Invasão de Memória

 

Bellacosa Mainframe e as tabelas internas no COBOL occurs e arrays

☕💥 Arrays em COBOL: O Poder Oculto do OCCURS, SSRANGE e a Guerra Contra a Invasão de Memória

Ou como evitar transformar seu Address Space em um filme de terror para Sysprogs



Introdução

Existe um momento na vida de todo desenvolvedor COBOL júnior em que ele descobre duas verdades universais:

A primeira é que OCCURS parece simples até deixar de ser simples.

A segunda é que existe uma entidade maligna chamada:

SSRANGE

capaz de transformar uma manhã tranquila em uma reunião emergencial envolvendo desenvolvimento, suporte, infraestrutura, DBA, operador e um sysprog segurando uma caneca de café já fria.

E tudo isso por causa de um pequeno detalhe:

MOVE WS-NOME(9999)

quando a tabela possui apenas:

OCCURS 100 TIMES.

Bem-vindo ao fascinante mundo das tabelas COBOL.


Capítulo 1 – O que é OCCURS?

OCCURS é o mecanismo utilizado pelo COBOL para criar estruturas repetitivas.

Em linguagens modernas chamaríamos isso de:

  • Array

  • Vetor

  • Lista fixa

  • Matriz

Exemplo:

01 CLIENTES.

   05 CLIENTE OCCURS 10 TIMES.

      10 NOME PIC X(30).
      10 IDADE PIC 99.

Memória:

CLIENTE(1)
CLIENTE(2)
CLIENTE(3)
...
CLIENTE(10)

COBOL simplesmente reserva um bloco contínuo.


A origem histórica

Década de 60.

Memória era absurdamente cara.

IBM 1401

4 KB

IBM System/360

256 KB

370

1 MB

Não existia:

  • Java Collections

  • Python List

  • C++ Vector

Era necessário reservar memória antecipadamente.

Daí nasceu:

OCCURS

Curiosidade histórica

Os engenheiros da IBM chamavam essas estruturas de:

Table Handling

Muito antes da expressão Array Processing se popularizar.


Capítulo 2 — Como a memória é organizada

Exemplo:

01 TAB.

   05 ITEM OCCURS 5 TIMES.

      10 CODIGO PIC 9(5).

Cada item ocupa:

5 bytes

Total

25 bytes

Layout:

0000 ITEM(1)
0005 ITEM(2)
0010 ITEM(3)
0015 ITEM(4)
0020 ITEM(5)

Acesso:

MOVE ITEM(3) TO WS-X

COBOL faz:

Base + ((3-1)*5)

Capítulo 3 – O Terror do Out of Bounds

Tabela:

05 CLIENTE OCCURS 100 TIMES.

Código:

MOVE NOME(101)

Problema.

A posição não existe.


Antigamente

Compilador:

NOSSRANGE

Padrão.

Nenhuma verificação.

Resultado:

Leitura aleatória.

Sobrescrever memória.

Corrupção.


O verdadeiro vilão

Imagine:

01 TABELA.

05 DADOS OCCURS 100 TIMES.

05 FLAG-FINAL PIC X.

Erro:

MOVE "S" TO DADOS(101)

Na prática:

FLAG-FINAL = S

ou pior.

Modifica outra estrutura.


Isso é invasão de memória?

Sim.

Tecnicamente:

Buffer overflow

Memory overwrite

Storage corruption


Capítulo 4 — Address Space

No zOS cada Job possui.

Address Space.

Exemplo

JOB1234



Private Area


LSQA


SWA


Subpools


Heap


Stack

Seu programa COBOL vive ali.


Se escrever fora da tabela:

pode corromper:

Working Storage

Heap

LE Runtime

Control Blocks


Em casos extremos:

S0C4

S878

U4038


Capítulo 5 — SSRANGE

A melhor invenção desde o café expresso.

Compilação:

SSRANGE

ou

CBL SSRANGE

Exemplo

MOVE WS-NOME(101)

Resultado:

Abend imediato.

Mensagem:

IGZxxxx

Subscript out of range


Excelente para:

Homologação

Teste

QA


Produção?

Normalmente:

NOSSRANGE

Performance melhor.


Dica Bellacosa

Desenvolvimento

SSRANGE

Produção

NOSSRANGE


Capítulo 6 — Índices

Ruim:

77 WS-I PIC 999.

Melhor:

05 CLIENTE OCCURS 100 TIMES
   INDEXED BY IDX.

SET

SET IDX TO 1

Próximo

SET IDX UP BY 1

Anterior

SET IDX DOWN BY 1

Por que índice é melhor?

Subscript:

CLIENTE(I)

Cálculo toda vez.


Index

Endereço pronto.

Ponteiro interno.

Mais rápido.


Capítulo 7 – Navegação

Crescente

SET IDX TO 1


PERFORM UNTIL IDX > MAX

PROCESSA

SET IDX UP BY 1

END-PERFORM

Decrescente

SET IDX TO MAX


PERFORM UNTIL IDX = 0


PROCESSA


SET IDX DOWN BY 1


END-PERFORM

Muito usado em:

Compressão

Ordenação

Rollback


Capítulo 8 — SEARCH

Busca sequencial.

SEARCH CLIENTE


AT END


DISPLAY "NAO ACHOU"


WHEN ID = WS-ID


DISPLAY NOME

END-SEARCH

Complexidade

O(n)


100 mil registros.

50 mil leituras médias.


SEARCH ALL

Arma secreta.

Busca binária.


Tabela obrigatoriamente ordenada.

SEARCH ALL CLIENTE


WHEN ID(IDX)=WS-ID


DISPLAY "ACHOU"

END-SEARCH

Complexidade

O(log n)


1000000 itens.

Comparações:

~20


Magia matemática.


Capítulo 9 — OCCURS DEPENDING ON

Tabela variável.

05 QTDE PIC 9(4).


05 CLIENTE OCCURS 1 TO 1000 TIMES

DEPENDING ON QTDE.

Muito usado em:

MQ

Copybooks

APIs

Arquivos


Capítulo 10 — Bidimensional

Exemplo.

Agência x Dia

05 MOVIMENTO.

10 AG OCCURS 100.

15 DIA OCCURS 31.

20 TOTAL PIC 9(10).

Uso:

TOTAL(10,15)

Agência 10.

Dia 15.


Tridimensional

ANO

MES

DIA
VENDAS(2026,6,23)

N dimensões

Teoricamente ilimitado.

Exemplo.

Banco.

País

Estado

Agência

Conta

Produto

Dia


Capítulo 11 — Ordenação

Tabela ordenada.

ASCENDING KEY

Muito útil para:

SEARCH ALL

Caches

Lookup


Capítulo 12 – Quando usar tabela

Excelente:

Parâmetros

Cache

Código UF

Tabela IR

CEP

Conversões


Ruim:

Milhões registros.


Melhor:

DB2

VSAM

IMS


Capítulo 13 – Performance

SEARCH

O(n)

SEARCH ALL

O(log n)

Index

Muito rápido

Subscript

Mais lento

SSRANGE

Seguro

NOSSRANGE

Rápido


Easter Egg COBOL

Existe uma lenda entre veteranos de mainframe.

Diz-se que em algum datacenter esquecido dos anos 80 existe um programa COBOL compilado com:

NOSSRANGE
OPT(2)
FASTSRT
ARITH(EXTEND)

executando desde 1987.

Ninguém sabe exatamente o que ele faz.

Ninguém possui o código-fonte.

Ninguém ousa recompilar.

Mas toda madrugada, às 02h17, ele produz um relatório financeiro perfeito, movimenta bilhões de dólares e desaparece novamente nas profundezas do JES2.

Os sysprogs apenas observam o spool, tomam um gole de café e repetem o antigo mantra do reino z/OS:

"Se está funcionando há 39 anos, não toque."


Conclusão

OCCURS é muito mais do que um simples array.

É uma das construções mais antigas, elegantes e eficientes já criadas para processamento em lote de grande volume.

Dominar:

  • OCCURS

  • INDEXED BY

  • SET

  • SEARCH

  • SEARCH ALL

  • SSRANGE

  • OCCURS DEPENDING ON

  • Tabelas multidimensionais

  • Navegação UP e DOWN

  • Layout de memória

  • Address Space do z/OS

é um dos marcos que separam o Padawan COBOL do Cavaleiro do Batch Jedi Council.

Porque no universo do Mainframe existe uma verdade absoluta:

"DB2 pode falhar, CICS pode reciclar, VSAM pode corromper, mas um OCCURS acessado fora dos limites sempre encontrará uma maneira criativa de arruinar o dia de alguém."

quinta-feira, 23 de maio de 2013

☕🔥 ABEND S0C4 — O “BURACO NEGRO DA MEMÓRIA” NO MAINFRAME

 

Bellacosa Mainframe abend s0c4

☕🔥 ABEND S0C4 — O “BURACO NEGRO DA MEMÓRIA” NO MAINFRAME

Quando o IBM Z Diz:

“VOCÊ TOCOU EM UMA ÁREA QUE NÃO DEVERIA EXISTIR.”

Se existe um ABEND que faz veterano suspirar fundo…

é o lendário:

🚨 S0C4

E normalmente ele aparece assim:

SYSTEM COMPLETION CODE=0C4

ou:

PROTECTION EXCEPTION

ou ainda:

ADDRESSING EXCEPTION

E então o Junior Padawan entra em desespero:

“O COBOL explodiu?”
“O dataset corrompeu?”
“O CICS morreu?”
“A memória evaporou?”

☕ Respira.

Porque o S0C4 é um dos ABENDs MAIS IMPORTANTES da computação corporativa.


🔥 O QUE É O S0C4?

O S0C4 é um:

🚨 PROTECTION / ADDRESSING EXCEPTION

Traduzindo:

O PROGRAMA TENTOU ACESSAR UMA ÁREA DE MEMÓRIA INVÁLIDA.

Ou:

  • memória proibida

  • endereço inexistente

  • ponteiro inválido

  • storage corrompido

  • área não autorizada


☕ A FILOSOFIA DO S0C4

O IBM Z protege memória como um cofre nuclear.

Seu programa NÃO pode simplesmente sair acessando qualquer lugar.

Quando tenta…

💥 S0C4


🔥 ANALOGIA BELLACOSA MAINFRAME

Imagine um funcionário entrando em um banco.

Ele pode acessar:

✅ sua mesa
✅ seu departamento

Mas de repente tenta entrar:

❌ no cofre principal
❌ na sala do presidente
❌ na área militar subterrânea

O segurança aparece.

Isso é o:

☠️ S0C4


☕ O QUE REALMENTE ACONTECE

O programa executa:

MOVE
MVC
LOAD
STORE

Tudo normal.

Mas então tenta:

acessar endereço inválido

A MMU (Memory Management Unit) do IBM Z detecta:

❌ acesso ilegal

Resultado:

🚨 INTERRUPTION CODE → S0C4


🔥 OS TIPOS MAIS COMUNS DE S0C4


☠️ Protection Exception

Tentou acessar storage protegido.


☠️ Addressing Exception

Endereço inválido.


☠️ Translation Exception

Página inexistente.


☠️ Storage Overlay

Memória corrompida anteriormente.


☕ O MAIOR VILÃO DO S0C4

🚨 SUBSCRIPT FORA DA TABELA

O clássico dos clássicos.


🔥 EXEMPLO COBOL JUNIOR

01 WS-TABELA.
   05 WS-ITEM OCCURS 10 TIMES
      PIC X(10).

01 IDX PIC 9(04).

Tudo bem.

Mas aí:

MOVE WS-ITEM(999) TO WS-CAMPO

O COBOL tenta acessar memória além da tabela.

Resultado:

☠️ S0C4


☕ O DEMÔNIO CHAMADO SSRANGE

Sem:

SSRANGE

o COBOL NÃO protege tabelas adequadamente.

Então:

  • leitura inválida

  • corrupção silenciosa

  • overlay

  • S0C4 mais tarde


🔥 O S0C4 FANTASMA

O mais assustador.

Erro aparece LONGE da causa real.


☕ EXEMPLO

Linha 100:

MOVE lixo para tabela

Linha 5000:

💥 S0C4

O dano ocorreu antes.

Mas a explosão veio depois.


🔥 O S0C4 E O CICS

No CICS normalmente vira:

🚨 ASRA + S0C4

O CICS intercepta o program check.


☕ O CASO MAIS FAMOSO NO CICS

DFHCOMMAREA inválida

Programa espera:

01 DFHCOMMAREA.
   05 WS-CODIGO PIC 9(05).

Mas recebe:

  • tamanho menor

  • layout diferente

  • lixo

  • ponteiro inválido

Agora:

MOVE WS-CODIGO

explode.


🔥 O LINKAGE SECTION MALDITO

Outro clássico.


☕ EXEMPLO

PROCEDURE DIVISION USING LK-AREA.

Mas o chamador envia:

parâmetro incompatível

Agora o programa lê memória errada.

Resultado:

☠️ S0C4


🔥 O VERDADEIRO HORROR: OVERLAY

Aqui começa o lado sombrio do mainframe.


☕ O QUE É OVERLAY?

Programa sobrescreve memória alheia.

Exemplo:

STRING A B C
 INTO CAMPO-PEQUENO

Overflow.

Agora memória próxima é destruída.

Mais tarde:

💥 S0C4


🔥 O S0C4 E O PONTEIRO NULO

Muito comum em:

  • assembler

  • C

  • LE

  • APIs

Equivalente mainframe do:

NULL POINTER


☕ O QUE O DUMP ESTÁ DIZENDO

O dump do S0C4 é um mapa do crime.

Veteranos leem como CSI mainframe.


🔥 COMO INVESTIGAR PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE O PSW

Exemplo:

PSW AT TIME OF ERROR

Esse é o GPS do desastre.


✅ PASSO 2 — PEGUE O INTERRUPTION CODE

Exemplo:

0004

ou:

00000010

Ajuda identificar:

  • protection

  • addressing

  • translation


✅ PASSO 3 — IDENTIFIQUE O OFFSET

Exemplo:

OFFSET X'02FA'

✅ PASSO 4 — CRUZE COM O LISTING COBOL

Agora você encontra:

MOVE WS-TABELA(IDX)

Boom.

Caso resolvido.


☕ O SEGREDO DOS REGISTERS

Especialmente:

R1
R13
R14
R15

☕ R13

Stack/save area.


☕ R14

Return address.


☕ R15

Entry point/programa.


🔥 O HEXADECIMAL ENTRE AS SOMBRAS

Veteranos analisam:

00000000

Endereço zero.

Clássico ponteiro inválido.


☕ O “LOW VALUES DA MORTE”

Outro clássico:

X'00'

Memória zerada sendo usada como endereço.


🔥 O S0C4 E O AMODE/RMODE

Modo arquimago mainframe ativado.

Problemas entre:

  • 24 bits

  • 31 bits

  • 64 bits

podem gerar endereços inválidos.


☕ O S0C4 E O COBOL MODERNO

Hoje ainda ocorre muito por:

  • APIs

  • ponteiros

  • XML PARSE

  • JSON PARSE

  • LE

  • integração C


🔥 COMO EVITAR S0C4


✅ Compile com SSRANGE


✅ Valide índices


✅ Revise OCCURS


✅ Cuidado com REDEFINES


✅ Valide COMMAREA


✅ Nunca confiar em parâmetro externo


✅ Revisar overlays


☕ O SSRANGE — O ESCUDO DOS JEDIS

Compilar:

SSRANGE

faz o COBOL detectar acesso inválido ANTES da corrupção.

Sem isso:

corrupção silenciosa.


🔥 CURIOSIDADE HISTÓRICA

O S0C4 vem das arquiteturas:

IBM System/360

Década de:

🏛️ 1960

É literalmente um dos mecanismos clássicos de proteção de memória da história da computação.


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“S0C4 é o mainframe dizendo:

VOCÊ TOCOU ONDE NÃO DEVIA.”


🔥 O MAIOR ERRO DO PADAWAN

Olhar apenas:

S0C4

e pensar:

“o COBOL morreu aqui.”

Não.

Frequentemente:

o crime aconteceu muito antes.


☕ A VERDADE FINAL

O S0C7 destrói números.
O S0C1 destrói instruções.
Mas…

☕ O S0C4 DESTRÓI A PRÓPRIA GEOGRAFIA DA MEMÓRIA.

Porque naquele instante…

O PROGRAMA TENTOU ATRAVESSAR UMA FRONTEIRA QUE O IBM Z JAMAIS PERMITIRIA.

domingo, 14 de abril de 2013

☕🔥 ABEND S0C1 — O “SALTO PARA O VAZIO” DO MAINFRAME

 

Brllacosa Mainframe abend soc1

☕🔥 ABEND S0C1 — O “SALTO PARA O VAZIO” DO MAINFRAME

Quando a CPU IBM Z Tenta Executar…

“ALGO QUE NÃO É UM PROGRAMA.”

Se existe um ABEND que faz o programador COBOL olhar o dump como se fosse hieróglifo alienígena…

é o lendário:

🚨 S0C1

E normalmente ele aparece assim:

IEC999I SYSTEM COMPLETION CODE=0C1

ou:

ABEND=S0C1 U0000 REASON=00000001

ou ainda:

OPERATION EXCEPTION

E aí o Junior Padawan pensa:

“Meu COBOL está quebrado?”
“O compilador enlouqueceu?”
“O load module morreu?”
“A CPU tentou executar magia negra?”

☕ Calma.

Porque o S0C1 é um dos ABENDs MAIS PROFUNDOS do universo z/OS.


🔥 O QUE É O S0C1?

O S0C1 é um:

🚨 OPERATION EXCEPTION

Traduzindo:

A CPU tentou executar uma instrução inválida.

Ou seja:

O processador IBM Z olhou para um byte da memória e disse:

❌ “ISSO NÃO É UMA INSTRUÇÃO MACHINE CODE VÁLIDA.”


☕ A FILOSOFIA DO S0C1

O S0C1 é assustador porque normalmente significa:

o fluxo do programa saiu da realidade esperada.

Algo desviou execução para:

  • lixo

  • dados

  • memória corrompida

  • endereço inválido

  • programa errado

  • módulo quebrado


🔥 O QUE REALMENTE ACONTECE

Imagine:

CPU IBM Z

Executando:

LOAD
ADD
MVC
BRANCH

Tudo normal.

Mas de repente…

o Program Counter aponta para:

FF FF FF FF

ou:

40404040

A CPU tenta interpretar aquilo como instrução.

Resultado:

💥 S0C1


☕ ANALOGIA BELLACOSA MAINFRAME

Imagine um piloto automático de avião.

Ele espera comandos válidos:

SUBIR
DESCER
CURVA

Mas recebe:

ABACAXI CÓSMICO

O sistema entra em colapso.

Isso é o S0C1.


🔥 O MAIOR SEGREDO

S0C1 raramente é “o problema”.

Ele normalmente é:

consequência de corrupção anterior.


☕ AS CAUSAS MAIS COMUNS


🚨 CALL para programa inexistente

Clássico absoluto.

CALL 'PGMXYZ'

Mas o módulo:

não existe

ou está errado.


🚨 Link-edit incorreto

Load module quebrado.


🚨 Branch para storage inválido

O programa desviou para memória errada.


🚨 Overlay de memória

Programa sobrescreveu área crítica.


🚨 Parameter list inválida

Muito comum em LINKAGE SECTION.


🚨 Executar dados como código

O horror máximo.


☕ O CASO MAIS FAMOSO

COBOL CHAMANDO MÓDULO ERRADO

Exemplo:

CALL WS-NOME-PGM

Mas:

WS-NOME-PGM = '     '

ou:

WS-NOME-PGM = '12345'

Agora o sistema tenta carregar lixo.

Resultado:

☠️ S0C1


🔥 O “CALL DINÂMICO MALDITO”

Veteranos têm pesadelos com isso.


☕ CALL ESTÁTICO

Seguro:

CALL 'CALCPGM'

☕ CALL DINÂMICO

Perigoso:

CALL WS-PGM

Porque:

  • pode vir espaço

  • pode vir lixo

  • pode vir nome inválido

  • pode vir lower-case

  • pode vir módulo inexistente


🔥 O S0C1 E O LOAD MODULE

Outro clássico.

Programa compilou.

Mas:

  • link-edit errado

  • módulo corrompido

  • versão incompatível

  • biblioteca incorreta

Então o entry point fica inválido.


☕ O S0C1 E O CICS

No CICS ele normalmente vira:

🚨 ASRA + S0C1

Porque o CICS encapsula o erro.


🔥 O VERDADEIRO TERROR: OVERLAY

Aqui começa o lado sombrio do mainframe.


☕ O QUE É OVERLAY?

Programa sobrescreve memória que não deveria.

Exemplo:

MOVE WS-TEXTO(1:500)
  TO WS-CAMPO(1:10)

ou:

SUBSCRIPT fora da tabela

Agora bytes críticos são destruídos.

Mais tarde…

a CPU tenta executar aquela região.

Resultado:

☠️ S0C1


🔥 O S0C1 FANTASMA

O mais assustador.

Erro acontece LONGE da causa real.

Exemplo:

Linha 100 corrompe memória

Mas o programa explode:

na linha 9000

☕ COMO INVESTIGAR O S0C1 PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE O PSW

O dump mostra:

PSW AT TIME OF ERROR

Esse é o GPS da tragédia.


✅ PASSO 2 — VEJA O ENDEREÇO

Exemplo:

INSTRUCTION ADDRESS = 00F13A92

✅ PASSO 3 — OLHE O OPCODE

O dump mostra algo como:

0000 0000
FFFFFFFF
40404040

Veterano já suspeita:

“isso não é código executável.”


🔥 O HEXADECIMAL MAIS ASSUSTADOR

40404040

No EBCDIC:

espaços

Ou seja:

A CPU tentou executar espaços como instrução.

Isso é clássico S0C1.


☕ COMO LER O DUMP


☕ PSW

Mostra:

  • endereço

  • modo da CPU

  • interrupção


☕ REGISTERS

Especialmente:

R14
R15

☕ R15

Muitas vezes aponta:

  • programa atual

  • entry point


☕ OFFSET

Exemplo:

OFFSET X'01FA'

Cruze com o listing COBOL.


🔥 O MOMENTO JEDI

Você pega:

  • PSW

  • offset

  • compile listing

E encontra:

CALL WS-PGM

Boom.

Caso resolvido.


☕ O S0C1 E O JCL

Outro clássico:

//STEPLIB DD DSN=LIB.ERRADA

Programa carrega versão incompatível.

Resultado:

💥 S0C1


🔥 O S0C1 E O AMODE/RMODE

Agora entramos no modo arquimago mainframe.

Problemas entre:

  • AMODE 24

  • AMODE 31

  • AMODE 64

podem causar branches inválidos.


☕ O S0C1 E O LE (LANGUAGE ENVIRONMENT)

Às vezes:

  • LE incompatível

  • runtime quebrado

  • mismatch de compilação

também geram S0C1.


🔥 COMO EVITAR S0C1


✅ Validar CALL dinâmico


✅ Não usar nomes vazios


✅ Evitar overlays


✅ Validar subscripts


✅ Revisar LINKEDIT


✅ Conferir STEPLIB/JOBLIB


✅ Usar SSRANGE

Grande arma contra corrupção de tabela.


☕ O SSRANGE — ESCUDO DOS PADAWANS

Compilar com:

SSRANGE

faz COBOL detectar acesso inválido em tabela.

Sem isso:

corrupção silenciosa.


🔥 CURIOSIDADE HISTÓRICA

O S0C1 vem das arquiteturas System/360.

Década de:

🏛️ 1960

Estamos falando de um erro nascido literalmente junto com a computação corporativa moderna.


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“S0C1 é a CPU dizendo:

EU NÃO FAÇO IDEIA DO QUE VOCÊ MANDOU EXECUTAR.”


🔥 O MAIOR ERRO DO JÚNIOR

Ver:

S0C1

e assumir:

“o COBOL está errado.”

Não.

Frequentemente:

  • ambiente

  • load module

  • memória

  • linkage

  • call

  • JCL

são os culpados.


☕ A VERDADE FINAL

O S0C7 quebra números.
O S0C4 quebra memória.
Mas…

☕ O S0C1 QUEBRA A PRÓPRIA LINGUAGEM DA CPU.

Porque naquele instante…

O IBM Z PAROU DE ENTENDER O QUE ESTAVA SENDO EXECUTADO.