The source content for blog.juliobiason.me
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
3.7 KiB

+++
3 years ago
title = "O problema de go não é a vulnerabilidade do XML"
date = 2020-12-15
[taxonomies]
tags = ["go", "golang", "padrões", "xml", "vulnerabilidade"]
+++
Ontem eu postei [alguns comentários sobre a vulnerabilidade da biblioteca XML
do go](@/links/go-xml-vulnerability.pt.md) e algumas pessoas disseram que isso
não era grande coisa.
O problema não é a vulnerabilidade em si, no entanto.
<!-- more -->
Ainda, o problema é só parcialmente com relação ao fato que a vulnerabilidade
não pode ser corrigida de forma confiável. E não é em relação à biblioteca
"http" que tinha um problema de negação-de-serviço. E não é em relação à
biblioteca de números naturais (e mais especificamente `divRecursiveStep`) que
causou um erro na rede de Etherium. E não é em relação que a biblioteca "ssh"
tinha uma vulnerabilidade que foi corrigida.
O problema é o padrão.
Eu não espero que as coisas tenham aquele toque místico de "tudo tem que ser
perfeito". Poxa, com a exceção do problema da biblioteca "xml", todos os outros
problemas já foram corrigidos.
Mas existe um padrão surgindo na biblioteca padrão do go que mostra quão pouco
cuidado foi tomado na sua construção. E, junto com esse padrão, tem o
problema que isso está na biblioteca padrão. Bibliotecas padrão deveriam, além
de prover uma infra-estrutura para aplicações maiores, serem implementações de
referencia. Por exemplo, se você quiser saber como é que diabos o Python fez
para adicionar suporte ao SQLite, basta você olhar a biblioteca padrão (FFI);
ou se você se perguntar como é que sets em Python são tão rápidos (tão rápidos
com relação ao resto das coisas em Python, quero dizer), você também
pode consultar a biblioteca padrão (sets são escritos em C); ou como é que eles
fizeram para que "namedtuples" criassem objetos magicamente (`eval`). Essas
partes descrevem como você deve construir algo que conecte com algo externo,
que seja rápido ou que seja mágico.
E esse padrão mostra que a biblioteca padrão do go está fazendo as coisas de
forma errada. Parece que o time de go focou muito em "adicionar valor" e muito
pouco em "servir de referência".
Outra indicação que tem algo errado com a linguagem: em quatro meses, o
problema da ordenação não pode ser corrigido. Em metade desse tempo eu consigo
escrever *bindings* da libxml2 em Python, ou até mesmo em Rust, mesmo não tendo
experiência alguma com o FFI de Python ou Rust. Isso significa que essa camada
que dá acesso a biblioteca padrão à coisas externas está tendo muito controle,
de forma que estruturas externas não podem ser usadas sem que sejam bagunçadas
pelo runtime. Se o FFI tivesse liberdade suficiente para expor somente a camada
mais externa, escrever uma implementação de parser XML em C e só expor as
camadas superiores seria completamente viável em quatro meses -- mesmo sem usar
a libxml2.
Todos esses padrão mostram que tem algo de errado com a arquitetura da
linguagem. E é por isso que eu disse que qualquer coisa no mínimo semi-séria
não deveria ser escrita em go.
Eu sou uma pessoa que diz coisas controversas de tempo em tempos. No começo
desse ano eu disse, em um evento, que um líder técnico que valesse o seu
próprio salário não recomendaria go para coisa alguma. E eu mantenho essa
posição. Líderes técnicos devem ver esse tipo de problema aparecer e tomar
ações para evitar que o projeto caia num buraco que seja complicado de sair
depois. E esse padrão de problemas com go já tem aparecido a muito tempo.
PS: Vocês devem ter notado que eu digitei "go" e não "Go" na maior parte desse
post. Isso é proposital; eu não acredito que a linguagem mereça ser chamada com
um "G" maiúsculo.
<!--
vim:spelllang=pt:
-->