Skip to content

Multi Language Support

nbsjunior edited this page Aug 11, 2026 · 2 revisions

Briefing para CTO / líder técnico: comece por Posicionamento-e-metricas e o Home.

Multi Language Support

Matriz de linguagens

Linguagem Extensões Regras genéricas (any) Regras dedicadas
Python .py Segredo hardcoded, TODO marker SQL injection, weak hash, eval/exec, debug statement
JavaScript/TypeScript .js/.jsx/.mjs/.cjs, .ts/.tsx Segredo hardcoded, TODO marker SQL injection, weak hash, eval/exec, debug statement
Java .java Segredo hardcoded, TODO marker Weak hash
Go .go Segredo hardcoded, TODO marker —
C# .cs Segredo hardcoded, TODO marker SQL injection via ADO.NET (SqlCommand)
VB.Net .vb Segredo hardcoded, TODO marker SQL injection via ADO.NET
COBOL .cbl, .cob, .cpy TODO marker Segredo hardcoded (MOVE...TO), GO TO (code smell)
T-SQL / DB2 SQL .sql Segredo hardcoded, TODO marker SQL dinâmico via concatenação (SET @sql = ... +)

Todas as regras têm casos no corpus golden com F1 = 1.00 — rode node packages/ruleforge/src/cli.ts evaluate para conferir.

Por que algumas linguagens precisam de regra própria

Regras com languages: ["any"] funcionam para qualquer linguagem porque o padrão que buscam (uma string literal longa após =/:, um comentário TODO) é sintaticamente parecido entre linguagens. Mas construções mais específicas exigem um padrão dedicado:

  • COBOL: atribuição é MOVE 'valor' TO campo, não campo = 'valor' — a regra genérica de segredo hardcoded não bate. Identificadores usam hífen (WS-DB-PASSWORD), então até o padrão dedicado precisou de ajuste ([\w-]* em vez de \w*).
  • C#/VB.Net: SQL injection via ADO.NET é new SqlCommand("..." + var) — uma instanciação de objeto, não uma chamada de função como execute(...) em Python.
  • T-SQL/DB2: SQL dinâmico é tipicamente SET @sql = '...' + @var seguido de EXEC(@sql) — em linhas separadas. O matcher MVP é por linha, então a regra mira a linha de concatenação, não a de execução (ver limitação em docs/ARCHITECTURE.md).

Adicionando uma linguagem nova

  1. Adicione o tag em RuleLanguage (packages/contracts/src/rules.ts).
  2. Mapeie a(s) extensão(ões) em EXT_TO_LANG (packages/scanner/src/engine.ts).
  3. Adicione pelo menos uma regra dedicada com um caso match e um no_match real no corpus golden (packages/ruleforge/corpus/golden.json) — evite adicionar uma linguagem sem nenhuma regra própria testada.
  4. Crie um arquivo de exemplo em examples/legacy/ e rode o scanner nele para confirmar detecção real, não só o evaluate do corpus.

Risco conhecido em escala

Tree-sitter (motor V1+) tem gramáticas maduras para C#, Java, SQL genérico. COBOL e VB.Net têm gramáticas comunitárias menos maduras, com cobertura parcial de dialetos (COBOL tem múltiplas variantes de compilador — IBM Enterprise COBOL, Micro Focus, GnuCOBOL). O embedded SQL do COBOL (EXEC SQL ... END-EXEC) mistura duas gramáticas no mesmo arquivo, o que pode exigir um parser dedicado em vez de depender de tree-sitter pronto. Ver docs/ARCHITECTURE.md § Escala para o detalhamento.

Clone this wiki locally