Translate

terça-feira, 11 de junho de 2024

COBOL Ponteiros de Memória: Os Cristais Kyber Escondidos do IBM Z – O Lado Sombrio dos Ponteiros - Parte III

 

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.


Continua na Parte 4

O Padawan Avançado: COBOL, Metal C, APIs, Buffers Compartilhados, JSON, MQ, Shared Memory e as Técnicas Jedi de Alto Desempenho no IBM Z.


Sem comentários:

Enviar um comentário