Memory safety não é o que você pensa
Com a fama de Rust, surgiram muitas pessoas interessadas na linguagem, mas também surgiram muitas para criticar. Críticas essas principalmente focadas em um aspecto específico da linguagem: Rust diz ser memory safe.
E então surge o ceticismo e, com ele, "argumentos" como:
- "Falhas de segurança são culpa do programador."
- "Rust diz ser segura, mas não tem provas disso."
- "Dá para explorar Spectre em Rust, ela não é memory safe. Viu só?"
- "Olha, um código Rust com falha de segurança. Viu? Viu???"
- etc.
Entre outros argumentos sem embasamento técnico que são totalmente errados desde a concepção, uma vez que ninguém nunca disse que software escrito em Rust não tem falhas de segurança. O conceito de safety de uma linguagem de programação não é sobre isso.
Esses erros são cometidos pela falta de estudos sobre Programming Language Theory (PLT), que é a ramificação da Ciência da Computação que estuda o design e implementação de linguagens de programação.
Nesta área, o conceito de "safe" (que é diferente da palavra "secure" em Inglês) não está relacionado a segurança da informação e/ou falhas de segurança (repare: é information security e não information safety!). O conceito é sobre comportamento, não é sobre cybersec.
Quase toda operação na especificação de uma linguagem tem um comportamento bem definido do que vai acontecer no programa quando aquela operação é executada, mas é possível que, propositalmente, quem projetou a linguagem não defina o comportamento do programa quando uma determinada operação é executada. Exemplo em C:
char *str = NULL;
*str = 'A';
A especificação da linguagem C (ISO/IEC 9899) diz que escrever dados em um ponteiro NULL é comportamento indefinido (undefined behavior). Isto significa que a spec não diz o que vai acontecer, então o que acontece na prática depende de vários fatores: do compilador, do sistema operacional, do estado atual do processo e por aí vai.
Nota: Repare que este é um comportamento indefinido relacionado ao sistema de memória (memory) da linguagem.
Como mencionei antes, o conceito de safe é sobre comportamento. Um código safe é um código que não tem comportamento indefinido, todo comportamento no código é perfeitamente bem definido na especificação da linguagem.
Quando a gente diz que uma linguagem é memory safe, basicamente estamos dizendo que a linguagem não tem comportamento indefinido nas operações relacionadas ao sistema de memória, como: uso de ponteiros/referências, alocações de memória e afins.
E sim, isso pode ser provado. Não é a opinião do seu João de que Rust é memory safe. Ela é, isso é um fato.
E O QUE ISSO TEM A VER COM SEGURANÇA?
Bom, apesar do conceito de safety não ser sobre segurança, mas sim sobre comportamento, existe sim uma relação entre memory safety e segurança:
O fato é que a GIGANTESCA maioria das falhas de segurança em programas, escritos em C ou C++, são causadas por comportamento indefinido.