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ódigo | Severidade | O quê |
|---|---|---|
posse-movida | erro | usar um dono depois de mover() — é provável em um arquivo só |
recurso-vazado | aviso | um dono criado e nunca solto naquele caminho |
emprestimo-escapa | aviso | o 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 quando | Porque |
|---|---|
o nome não nasceu de Arcane.Posse | o 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ção | quem recebe passa a ser o dono, e o arquivo não vê isso |
| o dono entra num escopo | o escopo solta, e ele pode fechar em outro lugar |
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:
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.