Repository navigation
Multi Language Support
Briefing para CTO / líder técnico: comece por Posicionamento-e-metricas e o Home.
| 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.
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ãocampo = '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 comoexecute(...)em Python. -
T-SQL/DB2: SQL dinâmico é tipicamente
SET @sql = '...' + @varseguido deEXEC(@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).
- Adicione o tag em
RuleLanguage(packages/contracts/src/rules.ts). - Mapeie a(s) extensão(ões) em
EXT_TO_LANG(packages/scanner/src/engine.ts). - Adicione pelo menos uma regra dedicada com um caso
matche umno_matchreal no corpus golden (packages/ruleforge/corpus/golden.json) — evite adicionar uma linguagem sem nenhuma regra própria testada. - Crie um arquivo de exemplo em
examples/legacy/e rode o scanner nele para confirmar detecção real, não só oevaluatedo corpus.
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.