Tuesday, July 01, 2014

Acompanhando a "limpeza" da LibReSSL

Quem me conhece sabe que, apesar de usar e promover o uso do Fedora, que é o meu Sistema Operacional favorito, eu também gosto bastante do OpenBSD (que usei de forma quase exclusiva por uns 3 anos, entre 2003 e 2006). Como não curto muito jogar no celular, minha distração digital é ler os commits do OpenBSD lá no MARC.info, e ocasionalmente olhar alguns diffs no FreshBSD, quando a commit message parece particularmente interessante ou divertida.

Desde o fork da OpenSSL, que se tornou a LibReSSL, venho lendo com atenção os commits nessa parte do repositório, e fiquei bem impressionado acompanhando as atividades de limpeza e refatoração do código, correção de bugs, eliminação de arquivos inúteis ou abandonados, opções de compilação de benefício duvidoso e o "estancamento" de muitos memory leaks. Eu já tinha medido de forma bem "crua" e nada científica a extensão do trabalho, medindo o número de arquivos antes e depois da limpeza, e o espaço em disco ocupado pela lib/libssl no meu checkout local do OpenBSD src. Tinha chegado à conclusão de que um terço do código já tinha ido pro /dev/null, mas muita coisa lá não era exatamente código, então sempre ficava aquela sensação de que tinha que achar uma maneira mais apropriada de medir essa limpeza.

Estes dias, lendo um post sobre o Minecraft feito em 500 linhas de Python, me deparei pela primeira vez com o comando "cloc", que calcula as LOCs de um ou mais arquivos fonte. Quando vi o cloc imediatamente lembrei da LibReSSL. Pode não ser perfeito nem exato, mas certamente já é uma aproximação muito melhor do que simplesmente medir o espaço em disco ocupado, hehehe. Obviamente o cloc está empacotado no Fedora, então é só procurar por ele no Softwares, ou abrir um terminal e rodar "sudo yum install cloc".

Aqui está o relatório do cloc no lib/libssl do OpenBSD src, com o checkout do que havia lá no início de abril, antes do fork:

-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                              911          32917          68531         234548
Perl                           166           8455           7874          67187
C/C++ Header                   189           5689          14741          32212
make                            80           1818            561          15623
Assembly                        14           1356           1405          11067
C++                             26           1860            760           4041
Bourne Shell                    62            777            702           3411
m4                               1            514              0           1585
DOS Batch                       33            413            133           1241
Lisp                             1              2             19             24
HTML                             1              2              2              3
-------------------------------------------------------------------------------
SUM:                          1484          53803          94728         370942
-------------------------------------------------------------------------------


No total eram 1484 arquivos fonte (reconhecidos pelo cloc) com um total de 370 KLOCs. Agora vamos ver o mesmo relatório com os fontes mais atuais:

-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                              674          23730          53766         171050
Perl                           116           7275           6966          60669
C/C++ Header                   125           4577          11686          25786
Assembly                        12           1154           1350           8660
Bourne Shell                    19            365            301           1850
m4                               1            514              0           1585
make                             3             19              4            301
-------------------------------------------------------------------------------
SUM:                           950          37634          74073         269901
-------------------------------------------------------------------------------


Uma bela limpeza! Mais de 500 arquivos e 100 KLOCs foram pro /dev/null até agora, e a LibReSSL continua compatível com a OpenSSL, sem quebrar a API e, a princípio, funcionando melhor, com menos bugs e leaks. É interessante ver também, nos commits, que mais gente tem começado a contribuir, o que parece ser um resultado positivo da limpeza e refatoração do código.

Se mais gente entende o código, mais gente sente vontade de contribuir. Obviamente reinventar a roda só por reinventar é uma perda de tempo, porém se o objetivo é chegar numa roda melhor, mais leve e com menos defeitos, certamente vale a pena. Alguns projetos de roda livre "coopetindo" entre si certamente levam a mais Software Livre de qualidade para todos. Boa sorte, LibReSSL!