| Bellacosa Mainframe e o ponteiro de memoria no cobol parte III |
COBOL Ponteiros de Memória: Os Cristais Kyber Escondidos do IBM Z
Parte 3 – O Lado Sombrio dos Ponteiros
SOC4, Memory Leaks, Dumps, IPCS, Fault Analyzer e os Monstros Escondidos no Heap do IBM Z
Por Bellacosa Mainframe
"O medo leva ao SET incorreto. O SET incorreto leva ao SOC4. O SOC4 leva ao dump. O dump leva ao sofrimento."
Mestre Sysprog Yoda/390
Introdução
Na Parte 1, aprendemos que ponteiros são apenas endereços.
Na Parte 2, descobrimos que podemos construir estruturas dinâmicas utilizando:
BASED
ALLOCATE
FREE
CEEGTST
CEEFRET
Linked Lists
Árvores
Heap
O jovem Padawan então pensa:
Mestre...
Se eu consigo criar estruturas dinâmicas...
O que acontece quando algo dá errado?
O mestre fecha os olhos.
Olha para um velho dump impresso em formulário contínuo.
Suspira.
E responde:
Aí você conhece o lado sombrio da Força.
Porque ponteiros oferecem poder.
Mas também oferecem a possibilidade de produzir alguns dos abends mais desagradáveis de todo o ecossistema IBM Z.
O que pode dar errado?
Muito.
Muito mesmo.
Mais do que a maioria dos desenvolvedores imagina.
Podemos dividir os problemas em:
Ponteiro inválido
Dangling Pointer
Overlay
Memory Leak
Double Free
Heap Corrompido
Race Condition
Uso após FREE
Stack Corruption
SOC4
S878
U4038
O rei do terror
S0C4
Todo sysprog conhece.
Todo desenvolvedor COBOL teme.
S0C4 normalmente significa:
Acesso indevido.
Proteção.
Endereço inválido.
Memória inexistente.
Visualmente
Memória válida
1000
até
2000
Ponteiro
90000000
Programa faz:
DISPLAY WS-NOME
SOC4.
Fim da aventura.
Exemplo clássico
01 PTR POINTER.
SET PTR TO NULL.
SET ADDRESS OF CLIENTE
TO PTR.
Tudo bem.
Agora.
FREE CLIENTE.
Memória foi embora.
Mas PTR continua.
Depois.
DISPLAY CLIENTE-NOME.
SOC4.
O que é Dangling Pointer?
Literalmente.
Ponteiro pendurado.
Imagine.
Apartamento demolido.
Endereço ainda existe.
Carteiro entrega carta.
Não há apartamento.
Mesmo conceito.
Visualmente
Antes
PTR
↓
70001000
CLIENTE
FREE
Depois
PTR
↓
70001000
Nada existe
Perigo.
Double Free
Outro clássico.
Exemplo
FREE CLIENTE.
FREE CLIENTE.
Primeiro funciona.
Segundo pode destruir.
Heap.
Erro.
U4038.
Abend.
Memory Leak
O inimigo invisível.
Aloca.
Nunca libera.
Exemplo
Loop
PERFORM 100000 TIMES
ALLOCATE NODE
END-PERFORM
Sem FREE.
Heap cresce.
Mais heap.
Mais heap.
Chega momento.
S878.
Ou
80A.
S878
Storage exhausted.
Sistema diz.
Não tenho mais memória.
Batch termina.
S80A
Também relacionado.
Storage.
Muito comum.
Quando leaks acumulam.
Overlay
Talvez pior.
Corrompe memória vizinha.
Exemplo
Área
30 bytes.
Programa escreve.
Destrói próximo campo.
Pode destruir ponteiro.
Depois.
Horas mais tarde.
SOC4.
Difícil rastrear.
Heap Corruption
Heap possui controles internos.
Programa altera.
Acidentalmente.
LE detecta.
U4038.
Heap inválido.
Race Condition
Aparece com threads.
Thread 1.
FREE.
Thread 2.
Usa ponteiro.
SOC4.
Intermitente.
Muito difícil.
Stack Corruption
Também existe.
Ponteiro aponta.
Stack local.
Procedimento termina.
Stack desaparece.
Ponteiro continua.
SOC4.
Como investigar?
Aqui o Padawan torna-se quase um arqueólogo digital.
Ferramentas.
Fault Analyzer
Excelente.
Mostra.
Linha COBOL.
Offset.
Variáveis.
Abend Aid
Muito usado.
Call stack.
PSW.
IPCS
Ferramenta Jedi.
Quase ritualístico.
Comandos.
IPCS.
VERBX.
LIST.
TRACE.
O que procurar?
PSW
Program Status Word.
Exemplo
PSW
078D1000
Indica.
Onde morreu.
Registradores
Especialmente.
R1
R13
R14
R15
Muito úteis.
CEEDUMP
Tesouro escondido.
LE gera.
Mostra.
Heap.
Stack.
Pointers.
Condition handlers.
Fantástico.
Fault Analyzer
Exemplo.
Mostra.
PTR-CLIENTE
0000000000000000
Uso posterior.
Linha.
Causa.
NULL POINTER.
Padawan feliz.
Problema encontrado.
Null Pointer
Melhor amigo.
Sempre.
Inicializar.
Exemplo
SET PTR TO NULL
Antes.
De tudo.
Validação
Boa prática.
Nunca confiar.
Exemplo
IF PTR = NULL
DISPLAY 'ERRO'
Evita desastre.
Storage Overlay
Pesadelo.
Programa A.
Destrói.
Programa B.
Erro aparece.
Horas depois.
Sintoma.
Aleatório.
Como evitar?
Muito simples.
Nunca.
Manipular bytes.
Sem necessidade.
Usar BASED.
Usar tamanho correto.
Documentar.
Segurança
Poucos falam disso.
Mas é importante.
Ponteiros podem expor.
Dados.
Cartões.
CPFs.
Buffers.
Tokens.
Ponteiro errado.
Pode acessar.
Memória sensível.
DoS
Negação de serviço.
ALLOCATE infinito.
Leva.
S878.
Sistema indisponível.
Programação defensiva
Bellacosa recomenda.
Sempre.
NULL.
Sempre.
FREE.
Sempre.
Verificar retorno.
Sempre.
Comentários.
Sempre.
Diagramas.
Checklist Jedi
Antes de usar
✅ Inicializou ponteiro
✅ Memória existe
✅ Heap válido
✅ Não foi liberado
✅ Documentado
Antes do FREE
✅ Não há outro ponteiro
✅ Não será reutilizado
Após FREE
FREE CLIENTE
SET PTR TO NULL
Excelente prática.
Curiosidade
A maioria dos problemas com ponteiros.
Não aparece.
Em teste.
Aparece.
Produção.
Três da manhã.
Fim de mês.
Batch crítico.
Naturalmente.
Curiosidade 2
Muitos dumps.
Levavam dias.
Na década de 80.
Hoje.
Fault Analyzer.
Resolve.
Em minutos.
Curiosidade 3
Muitos produtos IBM.
MQ.
DB2.
CICS.
LE.
Utilizam ponteiros extensivamente.
Mas.
Possuem décadas.
De refinamento.
O Conselho do Mestre Bellacosa
Ponteiros são como sabres de luz raros encontrados em uma antiga câmara Jedi esquecida dentro do datacenter IBM Z.
Eles permitem construir estruturas elegantes.
Eliminam cópias desnecessárias.
Criam caches.
Listas.
Árvores.
Buffers.
Soluções extremamente eficientes.
Mas também possuem um lado sombrio.
Um ponteiro não possui consciência.
Ele não sabe se a memória ainda existe.
Ele não sabe se outro programa a liberou.
Ele não sabe se o heap foi corrompido.
Ele apenas aponta.
E continuará apontando fielmente para um endereço inexistente até conduzir o Padawan diretamente ao inevitável SOC4.
Talvez essa seja a maior lição desta terceira jornada.
Datasets possuem catálogo.
Programas possuem load modules.
DB2 possui catálogo.
RACF possui perfis.
Mas um ponteiro possui apenas fé.
E fé demais em um endereço errado pode transformar até um tranquilo batch noturno em uma épica batalha contra dumps, registradores e monstros escondidos no Heap do Language Environment.
Sem comentários:
Enviar um comentário