Pular para o conteúdo

O que o `check` prova

Três diagnósticos, e — mais importante — os quatro silêncios.

O analisador acusa uso depois de mover, recurso que não é solto e empréstimo que escapa. Como em todo o resto da linguagem, o que o faz calar é tão importante quanto o que o faz falar.

CódigoSeveridadeO quê
posse-movidaerrousar um dono depois de mover() — é provável em um arquivo só
recurso-vazadoavisoum dono criado e nunca solto naquele caminho
emprestimo-escapaavisoo valor emprestado é guardado fora do escopo do empréstimo

Os dois últimos são aviso, e por um motivo: a análise vê um arquivo, e o recurso pode ser solto por um caminho que ela não enxerga — passado para uma ação de outro módulo, guardado num escopo que fecha depois. Um erro ali reprovaria código correto.

Os quatro silêncios#

Ele cala quandoPorque
o nome não nasceu de Arcane.Posseo exercício 118 tem um mover() de máquina de estados, e a primeira versão o acusou
você pergunta o estado (movido, vivo, contar)assert a.movido() depois do mover é justamente o que se escreve
o dono é devolvido pela açãoquem recebe passa a ser o dono, e o arquivo não vê isso
o dono entra num escopoo escopo solta, e ele pode fechar em outro lugar
dataforge
adopt Arcane.Posse as Posse

// Perguntar o estado é sempre legítimo — inclusive depois de mover.
d := Posse.dono({"x": 1})
novo := d.mover()
assert d.movido() is yes
assert novo.vivo() is yes

// E devolver o dono é o padrão de uma fábrica de recurso: quem
// chamou vira o dono, e o 'check' não acusa vazamento aqui.
action abrir_conexao(nome):
    yield Posse.dono({"nome": nome}, lambda v => void, nome)

c := abrir_conexao("loja")
assert c.usar(lambda v => v["nome"]) is "loja"
c.soltar()

Silenciar de propósito#

Quando o analisador está certo e o código também — um recurso solto por um caminho que ele não vê —, a saída é nomear a regra:

dataforge
adopt Arcane.Posse as Posse

action guardar_em_algum_lugar(d):
    yield d

d := Posse.dono({"x": 1})       // df: permitir recurso-vazado
guardar_em_algum_lugar(d)
out "o dono foi adiante, e quem recebe solta"

A regra tem de ser nomeada: um permitir solto esconderia o erro seguinte, que ninguém pediu para esconder. Um analisador sem escape obriga a escolher entre conviver com um alarme e desligar a verificação inteira — e a segunda é o que acontece.