# Verificador de estilo de iRules

> Cole um iRule e leia-o segundo o iRules Style Guide do DevCentral: indentação, chaves, comentários, expressões entre chaves, switch --, prioridade de eventos, nomes static:: e mais, além de uma verificação de sintaxe Tcl 8.4 real. Analisado, nunca executado. Local, sem rede.

- Tool: https://ronutz.com/pt-BR/tools/f5-irules-style-checker
- Family: Redes

---

## O que faz

Lê um iRule segundo o "iRules Style Guide" do DevCentral (publicado por JRahm com Jim_Deucker em 2022-12-22), acrescenta dois pontos levantados nos comentários do guia e passa sobre ele uma análise de sintaxe Tcl 8.4 real. A regra é analisada, nunca executada. Cada apontamento indica a regra de onde vem, a linha e o que mudar; as linhas apontadas ficam marcadas numa cópia numerada da regra.

## O que verifica

- **Configurações de editor (E1 a E3):** tabulações e indentações que não são múltiplas de 4 espaços, linhas com mais de 100 colunas (alerta acima de 120), fins de linha do Windows, espaço em branco no fim da linha, falta de quebra de linha no final e caracteres fora do ASCII, cada um nomeado com o code point, o nome oficial no Unicode e a coluna.
- **Regras numeradas:** caracteres que quebram o código (R1), o limite de tamanho da F5 (R2), uma `{` sozinha na linha ou `else` numa linha nova (R4), comentários no fim da linha, comentários sem espaço e comentários entre padrões do `switch` (R6), vários comandos numa linha (R7), `if` numa linha só (R8), estado guardado como palavras como `yes` (R9), `and` / `or` / `not` da F5 (R10), `}{` sem espaço ou uma palavra-chave colada à chave (R11), expressões sem chaves (R12), variáveis em expressões sem espaço em volta (R13) ou sem chaves em volta do nome (R14), `switch` e `table` sem `--` (R15), eventos sem prioridade (R16), entradas de `table` sem timeout nem lifetime (R17; sem eles, a referência de `table` da F5 aplica um timeout de 180 segundos e um lifetime indefinido), nomes `static::` sem prefixo (R18), flags de debug em `static::` (R19) e código comentado (R20).
- **Dos comentários do guia (D1, D2):** `==` ou `!=` com um texto, onde se queria `eq` ou `ne` (D1); `break` ou `continue` sem nenhum loop em volta, `break` num ramo de `switch` dentro de um loop, e `return` num ramo de `switch` (D2).
- **Sintaxe:** um erro que o parser do Tcl 8.4 aponta, como `}{` sem espaço ("extra characters after close-brace"), significa que o iRule não consegue nem carregar.

## Caracteres que se escondem no código

A primeira regra do guia trata de aspas curvas e espaços não separáveis que um editor de texto insere. O verificador classifica cada caractere fora do ASCII pelo Unicode Character Database 18.0.0, então encontra a família inteira, não só esses dois:

- **R1, erro:** caracteres invisíveis (a lista Default_Ignorable_Code_Point do Unicode: espaços e junções de largura zero, a marca de ordem de bytes, o hífen condicional, controles bidirecionais), espaços que não são o espaço ASCII (não separável, em, ideográfico e outros) e aspas tipográficas. Testado no tclsh 8.4.6: um espaço não separável cola duas palavras num único nome de comando, aspas curvas não agrupam palavras, e um espaço de largura zero depois de uma chave de fechamento para a regra com "extra characters after close-brace".
- **E3, alerta:** traços que não são o hífen-menos ASCII. O Tcl não os lê nem como hífen de opção nem como sinal de menos: um `switch` com uma meia-risca (U+2013) digitada onde deveria estar `--` toma o traço como valor e silenciosamente não casa nada.
- **E3, nota:** outros caracteres que parecem ASCII (letras de largura total, as reticências, algarismos romanos) e qualquer outro caractere fora do ASCII.

Isso vale para o próprio guia: como publicado em 2026-10-03, o exemplo de `RULE_INIT` tem um espaço de largura zero depois da chave de fechamento, e o exemplo de debug tem uma linha que contém só um deles, então copiar qualquer um dos dois literalmente quebra o iRule.

## O limite de tamanho

O F5 K9204 fixa o limite em 65.520 caracteres; o BIG-IP se recusa a salvar ou carregar um iRule maior, com um erro que diz "Max string size exceeded" e "max:65520". O guia arredonda isso para 64 KB. O verificador conta os caracteres e os bytes que eles ocupam em UTF-8, e aponta R2 quando qualquer um dos dois passa de 65.520.

## Dos comentários do guia

- **D1:** Kai Wilke apontou que o exemplo da regra 10 do guia compara texto com `==`, e os autores concordaram em acrescentar um ponto sobre `eq` / `ne`. O `==` compara como números sempre que os dois lados parecem números: no Tcl 8.4.6, `10 == 012` e `1 == "0x0000001"` são ambos verdadeiros. O How To Write Fast Rules da F5 pede números comparados com números e strings com strings.
- **D2:** Juergen Mang observou que os ramos de um `switch` não precisam de `return` nem de `break` para parar. Um ramo de `switch` nunca segue para o próximo, `return` sai do evento inteiro (a página de `return` da F5), e `break` sem nenhum loop em volta é um erro no Tcl 8.4.6 (verificado no corpo de um proc). A F5 não documenta o que o TMM faz com ele no corpo de um evento.

## Limites

- Variáveis de array como `$static::pools($key)` são Tcl válido, mas o motor de Tcl do site não as modela. O verificador lê cada uma como variável simples, continua verificando o resto da regra e avisa numa nota.
- Algumas regras não podem ser julgadas só pelo texto. Se uma linha começando com `#` é código comentado ou um comentário sem o espaço é um palpite baseado na primeira palavra, então esses apontamentos são notas.
- A regra R3 (dividir o iRule em blocos funcionais) é uma escolha de projeto que o verificador não julga. A R5 (a indentação de 4 espaços levada para valores aninhados, como os ramos de um `switch`) é coberta pela verificação de indentação. A configuração de editor sobre evitar continuações de linha não é verificada.

## Fontes

- [F5 DevCentral: iRules Style Guide, com os comentários](https://community.f5.com/t/irules-style-guide/71151) (lido em 2026-10-03)
- [F5 K9204: iRules are limited to 65,520 characters](https://my.f5.com/manage/s/article/K9204) (lido em 2026-10-03)
- [F5 K15650046: Tcl code injection security exposure](https://my.f5.com/manage/s/article/K15650046) (lido em 2026-10-03)
- [F5 K57410758: use curly braces to avoid double substitution](https://my.f5.com/manage/s/article/K57410758) (lido em 2026-10-03)
- [Referência de iRules da F5: How To Write Fast Rules](https://clouddocs.f5.com/api/irules/HowToWriteFastRules.html) (lido em 2026-10-03)
- [Referência de iRules da F5: return](https://clouddocs.f5.com/api/irules/return.html) (lido em 2026-10-03)
- [Referência de iRules da F5: priority](https://clouddocs.f5.com/api/irules/priority.html) (lido em 2026-10-03)
- [Referência de iRules da F5: table](https://clouddocs.f5.com/api/irules/table.html) (lido em 2026-10-03)
- [Manual do Tcl 8.4: switch](https://www.tcl-lang.org/man/tcl8.4/TclCmd/switch.htm) (lido em 2026-10-03)
- [Manual do Tcl 8.4: break](https://www.tcl-lang.org/man/tcl8.4/TclCmd/break.htm) (lido em 2026-10-03)
- [Unicode Character Database 18.0.0: PropList.txt](https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt) (lido em 2026-10-03)
- [Unicode Character Database 18.0.0: DerivedCoreProperties.txt](https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt) (lido em 2026-10-03)
- [Unicode Character Database 18.0.0: UnicodeData.txt](https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt) (lido em 2026-10-03)

## Standards and references

- [F5 DevCentral: iRules Style Guide (JRahm with Jim_Deucker, 2022-12-22)](https://community.f5.com/t/irules-style-guide/71151) - the editor settings and the numbered rules R1 to R20 the checker reads an iRule against; its comment thread (Kai Wilke on == against eq for text, D1; Juergen Mang on return and break in switch arms, D2)
- [F5 K15650046: Tcl code injection security exposure](https://my.f5.com/manage/s/article/K15650046) - always brace expressions; always put -- before the switch string; the bad option error a value starting with - produces
- [F5 K57410758: warning [use curly braces to avoid double substitution]](https://my.f5.com/manage/s/article/K57410758) - expr, if and while substitute an unbraced argument a second time; the validator warning and the braced fix
- [F5 iRules reference: priority](https://clouddocs.f5.com/api/irules/priority.html) - event priority runs from 0 to 1000, defaults to 500, and lower numbers run first
- [F5 iRules reference: table](https://clouddocs.f5.com/api/irules/table.html) - a table entry gets a default timeout of 180 seconds and an indefinite lifetime when none is given (the R17 finding)
- [F5 iRules reference: How To Write Fast Rules](https://clouddocs.f5.com/api/irules/HowToWriteFastRules.html) - switch over if, chained elseif over separate ifs, switch over matchclass up to 100 elements, braced expr (about a factor of 20), and comparing numbers to numbers and strings to strings, including == against eq (D1)
- [F5 K9204: iRules are limited to 65,520 characters](https://my.f5.com/manage/s/article/K9204) - the 65,520-character limit, and the errors BIG-IP reports when saving or loading a longer iRule (the R2 finding)
- [F5 iRules reference: return](https://clouddocs.f5.com/api/irules/return.html) - return causes immediate exit from the currently executing event (D2); its example writes if{ with no space, which Tcl 8.4.6 runs as a command named if{ (R11)
- [Tcl 8.4 manual: break](https://www.tcl-lang.org/man/tcl8.4/TclCmd/break.htm) - break aborts out to the innermost containing loop command; switch is not one (D2)
- [Tcl 8.4 manual: continue](https://www.tcl-lang.org/man/tcl8.4/TclCmd/continue.htm) - continue goes to the next iteration of the innermost containing loop (D2)
- [Tcl 8.4 manual: switch](https://www.tcl-lang.org/man/tcl8.4/TclCmd/switch.htm) - the -exact, -glob, -regexp and -- options, a body of - shared with the next pattern, default, and comments only inside bodies
- [F5 K6091: The version of Tcl used to develop iRules](https://my.f5.com/manage/s/article/K6091) - the iRules command set was developed from Tcl base version 8.4.6, which is used in all BIG-IP versions; the engine models that version
- [Tcl 8.4.6 source code, tag core-8-4-6 on GitHub](https://github.com/tcltk/tcl/tree/core-8-4-6) - the reference interpreter: the engine was differential-tested against tclsh built from this tag (commit bf3eeadc)
- [Unicode Character Database 18.0.0: UnicodeData.txt](https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt) - character names and compatibility decompositions
- [Unicode Character Database 18.0.0: PropList.txt](https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt) - the White_Space, Quotation_Mark and Dash properties
- [Unicode Character Database 18.0.0: DerivedCoreProperties.txt](https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt) - the Default_Ignorable_Code_Point property

## Related reading

- [ASCII: os 128 códigos, e por que a tabela é desenhada assim](https://ronutz.com/pt-BR/learn/ascii-the-128-codes.md): Sete bits, oito colunas, dezesseis linhas: como a tabela ASCII é organizada, por que maiúsculas e minúsculas estão a um bit de distância, para que os 33 controles foram definidos e quais ainda fazem alguma coisa, por que espaço em branco depende de quem pergunta, e as referências HTML que parecem ASCII e não são.
- [Caracteres escondidos e sósias: o que uma linha de texto pode esconder](https://ronutz.com/pt-BR/learn/hidden-and-lookalike-characters.md): Caracteres de largura zero, controles bidirecionais que reordenam o que você vê (Trojan Source), quebras de linha que o seu analisador não enxerga, letras cirílicas que passam por latinas, e as aspas e traços tipográficos que quebram configurações: o que cada um faz, como os documentos de segurança do Unicode os descrevem e como encontrá-los.
- [Como montar strings em iRules: aspas, chaves, append, concat e listas](https://ronutz.com/pt-BR/learn/irules-building-strings.md): Aspas substituem, chaves não, e colchetes rodam um comando: quase toda surpresa quando um iRule monta um valor vem dessas três regras. Veja o que o Tcl faz com cada palavra antes de um comando recebê-la, como append, concat e lappend diferem, por que um valor com espaços é uma lista, e como a dupla substituição deixa dados rodarem como código.
- [iRules LX, explicado: o que roda onde quando o Tcl chama o Node.js](https://ronutz.com/pt-BR/learn/irules-lx-explained.md): O iRules LX coloca um processo Node.js ao lado do Traffic Management Microkernel e deixa uma iRule em Tcl chamá-lo com ILX::call, esperar no máximo três segundos por padrão e receber a resposta como um valor Tcl. Este é o mecanismo inteiro, objeto por objeto e comando por comando, a partir da referência da própria F5: workspaces, extensões, plugins e a LX rule; ILX::init, ILX::call e ILX::notify; os modos de processo dedicado e único; o npm sem conexão com a internet; o runtime Node.js 6.9.1 que o BIG-IP 21.1 ainda entrega depois de remover o 0.12; a atualização que costumava quebrar workspaces; e as perguntas a fazer antes de um projeto depender dele.
- [O iRules Style Guide do DevCentral, regra por regra, com os motivos](https://ronutz.com/pt-BR/learn/irules-style-guide-explained.md): O DevCentral da F5 publicou em 2022 um iRules Style Guide: configurações de editor e vinte regras numeradas. Algumas são questão de gosto, mas várias evitam falhas reais: um iRule que não carrega, um switch que um atacante consegue manipular, uma expressão que roda dados da requisição como código, uma tempestade de log. Veja as regras agrupadas pelo que protegem, com o motivo de cada uma, o que os comentários do guia corrigiram e o que mudou desde que ele foi escrito.
- [Scripts Expect, lidos devagar: spawn, expect, send e os erros entre eles](https://ronutz.com/pt-BR/learn/expect-scripts-explained.md): O Expect conduz programas interativos desde 1990 com quatro verbos: spawn inicia um, expect espera a saída dele, send digita nele, interact o entrega a você. Engenheiros de rede ainda o escrevem para entrar numa caixa e ler uma resposta. A página de manual é curta e precisa, e quase todo script que se comporta mal quebra uma das frases dela: o timeout padrão de 10 segundos, a ação nula implícita, o padrão que esvazia o buffer, o caractere de retorno, a conexão fechada na saída. Aqui estão essas frases, com o que cada uma custa quando ignorada.
- [Zero ou um: onde o BIG-IP começa a contar](https://ronutz.com/pt-BR/learn/bigip-zero-or-one.md): O Tcl conta a partir de 0, vários comandos que a F5 acrescenta contam a partir de 1, contadores devolvem 1 para o primeiro item, muitos zeros da configuração são valores e não posições, e o mesmo segmento de caminho é o elemento 1, o campo 2 ou o índice 1 dependendo de quem pergunta. Veja de onde vem cada um, nas palavras da própria F5, com as armadilhas e os lugares em que as páginas da F5 se contradizem.
