Translate

Mostrar mensagens com a etiqueta Division by Zero. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Division by Zero. Mostrar todas as mensagens

terça-feira, 27 de maio de 2014

☕🔥 ABEND S0CB — O “DIVISOR IMPOSSÍVEL” DO MAINFRAME

 

Bellacosa Mainframe e o abend s0cb

☕🔥 ABEND S0CB — O “DIVISOR IMPOSSÍVEL” DO MAINFRAME

Quando o IBM Z Diz:

“VOCÊ TENTOU FAZER UMA CONTA QUE DESAFIA A MATEMÁTICA.”

Se existe um ABEND que faz o Junior Padawan perceber que:

até a matemática pode explodir no z/OS…

é o lendário:

🚨 S0CB

E normalmente ele aparece assim:

SYSTEM COMPLETION CODE=0CB

ou:

DECIMAL DIVIDE EXCEPTION

ou ainda:

FIXED-POINT DIVIDE EXCEPTION

E então nasce o desespero:

“O COBOL desaprendeu matemática?”
“O divisor virou entidade cósmica?”
“O COMP-3 entrou em colapso?”
“Eu dividi por zero?”
“COMPUTE virou arma nuclear?”

☕ Respira.

Porque o S0CB é um dos ABENDs MAIS CLÁSSICOS da aritmética IBM Z.

E um dos mais importantes para entender:

divisão decimal

overflow matemático

divide by zero

packed decimal

COMP-3

hardware arithmetic

dumps matemáticos


🔥 O QUE É O S0CB?

O S0CB é um:

🚨 DIVIDE EXCEPTION

Traduzindo:

A CPU IBM Z DETECTOU UMA OPERAÇÃO DE DIVISÃO INVÁLIDA.


☕ O GRANDE SEGREDO

O S0CB NÃO nasce no COBOL.

Ele nasce:

no hardware decimal do IBM Z.


🔥 O MOMENTO EXATO

Fluxo:

COMPUTE/DIVIDE
 ↓
COBOL gera instrução máquina
 ↓
CPU executa divisão
 ↓
Resultado inválido
 ↓
S0CB

☕ ANALOGIA BELLACOSA MAINFRAME

Imagine uma calculadora gigante bancária.

Você digita:

100 / 0

A calculadora olha para você em silêncio…

e explode dramaticamente.

Isso é:

☠️ S0CB


🔥 O MAIOR VILÃO

🚨 DIVISÃO POR ZERO

O rei absoluto do S0CB.


☕ EXEMPLO COBOL

COMPUTE WS-RESULT = WS-TOTAL / WS-QTD

Mas:

WS-QTD = ZERO

Resultado:

💥 S0CB


🔥 O “ZERO FANTASMA”

O mais traiçoeiro.


☕ EXEMPLO

MOVE SPACES TO WS-QTD

Depois:

COMPUTE WS-MEDIA = WS-TOTAL / WS-QTD

Dependendo do conteúdo:

☠️ desastre matemático.


🔥 O S0CB E O COMP-3

Agora entramos na matemática obscura do mainframe.


☕ EXEMPLO

PIC S9(7)V99 COMP-3

Packed decimal inválido pode causar:

divisão impossível.


🔥 O OVERFLOW MATEMÁTICO

Outro clássico.


☕ EXEMPLO

Resultado da divisão excede capacidade do campo.

01 WS-RESULT PIC 9(02).

Mas cálculo produz:

999999

CPU entra em sofrimento existencial.

Resultado:

💥 S0CB


🔥 O S0CB E O COMPUTE

Junior acha:

COMPUTE é inocente.

Não.

COMPUTE pode gerar:

  • DIVIDE

  • MULTIPLY

  • decimal arithmetic

  • overflow


☕ EXEMPLO CLÁSSICO

COMPUTE WS-PERC =
   (WS-VALOR * 100) / WS-TOTAL

Mas:

WS-TOTAL = 0

Resultado:

☠️ S0CB


🔥 O S0CB E O “ON SIZE ERROR”

Aqui nasce o conhecimento Jedi.


☕ EXEMPLO

DIVIDE A BY B
   GIVING C
   ON SIZE ERROR
      DISPLAY 'ERRO'
END-DIVIDE

Isso pode evitar alguns colapsos matemáticos.


🔥 MAS CUIDADO

Nem todo S0CB é tratado elegantemente.

Dependendo:

  • do runtime

  • do compilador

  • do tipo decimal

  • da instrução gerada

o ABEND ainda pode ocorrer.


☕ O S0CB E O ASRA

No CICS geralmente aparece como:

🚨 ASRA + S0CB

Porque o CICS intercepta a exceção matemática.


🔥 O S0CB E O DB2

Outro cenário clássico.

Valor vindo do DB2:

NULL
ZERO
DADO INVÁLIDO

Programa assume divisor válido.

Boom:

💥 S0CB


☕ O S0CB E O ARQUIVO

Campo numérico chega:

zerado

Mas ninguém validou.

Agora:

DIVIDE WS-QTD INTO WS-TOTAL

Resultado:

☠️ desastre financeiro.


🔥 O S0CB FANTASMA

O mais cruel.

Erro nasce MUITO antes.


☕ EXEMPLO

Linha 100:

MOVE ZERO TO WS-QTD

Linha 9000:

COMPUTE WS-MEDIA =
   WS-TOTAL / WS-QTD

Explosão distante da origem.


🔥 COMO INVESTIGAR O S0CB PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE O OFFSET

Exemplo:

PSW AT TIME OF ERROR
OFFSET X'01FA'

✅ PASSO 2 — PEGUE O LISTING COBOL

Cruze offset com:

  • compile listing

  • SYSADATA

  • Abend-AID

  • Fault Analyzer


✅ PASSO 3 — IDENTIFIQUE A DIVISÃO

Exemplo:

DIVIDE WS-A BY WS-B

ou:

COMPUTE WS-C = WS-A / WS-B

✅ PASSO 4 — INSPECIONE O DIVISOR

Pergunta sagrada:

“ELE ESTAVA ZERO?”


✅ PASSO 5 — ANALISE O STORAGE

Veja:

  • packed decimal

  • campos COMP-3

  • conteúdo hexadecimal

  • overflow


🔥 O DUMP DO S0CB

Aqui mora a matemática Jedi.

Veteranos analisam:

  • PSW

  • registers

  • decimal instructions

  • packed fields

  • operandos reais


☕ O PSW

Mostra:

ONDE A MATEMÁTICA MORREU.


🔥 O HEXADECIMAL IMPORTA

Exemplo válido:

F0F1F2

Número correto.


☕ EXEMPLO SUSPEITO

404040

Spaces em campo numérico.

Agora a divisão entra no reino do caos.


🔥 O S0CB E O “SOC7 DISFARÇADO”

Às vezes o problema real é:

dado inválido.

Mas explode durante divisão.

Veteranos investigam ambos:

  • S0CB

  • S0C7


☕ O MAIOR ERRO DOS JUNIORS

Corrigir apenas:

IF divisor = 0

sem entender:

POR QUE o divisor virou zero.


🔥 COMO EVITAR S0CB


✅ Validar divisor


✅ Usar ON SIZE ERROR


✅ Validar dados externos


✅ Revisar COMP-3


✅ Tratar NULL/zeros DB2


✅ Evitar overflow


✅ Revisar layouts


☕ O SEGREDO DOS VETERANOS

Veteranos protegem TODA divisão:

IF WS-QTD NOT = ZERO

Porque sabem:

matemática corporativa é território hostil.


🔥 CURIOSIDADE HISTÓRICA

O S0CB vem da arquitetura decimal do:

IBM System/360

Década de:

🏛️ 1960

IBM implementou aritmética decimal em hardware porque:

  • bancos

  • seguros

  • finanças

precisavam de precisão absoluta.


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“S0CB significa:

Seu Programa Descobriu Que Não Existe Divisão Por Nada.”


🔥 O MAIOR ENSINAMENTO DO S0CB

Ele ensina algo profundo:

no mainframe, matemática é levada absurdamente a sério.

A CPU IBM Z NÃO tolera:

  • divisões impossíveis

  • overflow decimal

  • operandos inválidos


☕ A VERDADE FINAL

O S0C7 pune números inválidos.
O S0C4 pune memória inválida.
O S806 pune programas inexistentes.
O S913 pune acessos proibidos.

Mas…

☕ O S0CB É O MOMENTO EM QUE A PRÓPRIA MATEMÁTICA DO IBM Z DECIDE QUE SUA CONTA NÃO FAZ SENTIDO PARA O UNIVERSO.