Pular para o conteúdo

Análise estática

O que o dataforge check encontra antes de executar, e por que ele é otimista.

Três etapas sem executar#

bash
dataforge check meu_programa.df
dataforge check src/ --strict      # avisos também falham
dataforge check x.df --syntax-only # só a sintaxe
  • Léxica — o arquivo é um DataForge válido?
  • Sintática — a estrutura faz sentido?
  • Semântica — os nomes existem? as chamadas batem? os tipos combinam?

O que ele encontra#

CategoriaExemploMensagem
nome indefinidosommar(1, 2)Did you mean `somar`?
aridadesomar(1)is missing argument(s): b
tipo de argumentosomar("x", 2)expects Integer but got String
tipo de variávelx: Integer := "texto"Declared as Integer but the value is String
tipo inexistentex: Intger := 1Did you mean `Integer`?
constante reatribuídaLIMITE := 200Cannot reassign the steady constant
operador incompatível1 + [2]Cannot add Integer and Cluster
campo de recordp.emialRecord has no field. Fields: nome, idade
membro de enumStatus.CanceladoMembers: Ativo, Inativo
código inalcançávellinha após yieldUnreachable code (aviso)
retorno ausente-> Integer sem yieldcan end without a yield (aviso)
halt fora de laçohalt outside of a loop

Um exemplo#

text
app.df:5:1: erro: Cannot reassign the steady constant 'LIMITE'
    sugestão: Use another name, or drop 'steady' from the declaration
app.df:9:11: erro: Parameter 'a' of 'somar' expects Integer but got String
    sugestão: Pass a Integer
app.df:10:5: erro: Undefined action 'sommar'
    sugestão: Did you mean 'somar'?

✗ 3 erro(s), 0 aviso(s)

Cada diagnóstico traz linha, coluna e sugestão. As sugestões de nome usam distância de edição — sommarsomar é encontrado automaticamente.

Por que é otimista#

O analisador fica calado quando não consegue provar que algo está errado. Isso é deliberado: DataForge é dinamicamente tipado, e um falso alarme atrapalha mais que um alerta perdido — porque ensina a ignorar as mensagens.

Calibragem atual: zero erros em 233 arquivos conhecidamente bons (os 190 exercícios mais os 42 exemplos).

O que ele não encontra#

dataforge
divisor := 0
out 10 / divisor      # o valor só é conhecido em tempo de execução

Isso passa no check e falha ao rodar. Erros que dependem de dados não são detectáveis estaticamente.

Erros dentro de monitor#

Código dentro de um monitor: existe justamente para conter falhas — provocar uma de propósito é legítimo. Por isso o analisador rebaixa erros a avisos ali dentro:

dataforge
monitor:
    x := 1 / 0        # aviso, não erro
handle e:
    out e.message

Em integração contínua#

bash
dataforge fmt . --check && dataforge check . && dataforge test

Cada comando sai com código diferente de zero em caso de falha. Com --strict, os avisos também derrubam o build.