Segurança em C++, em Contexto
Comitê, processo e recursos de segurança
- Muitos comentaristas estão frustrados porque boas ideias de segurança existem, mas a padronização é lenta e inconsistente (por exemplo,
std::spanfoi lançado sem.at()até o C++26, eoperator[]continua sem verificação). - Esclarecimento de que o comitê de C++ principalmente ratifica propostas apoiadas por implementações em funcionamento; ele não pode, unilateralmente, “impor” um novo C++.
- Compatibilidade com versões anteriores e estabilidade de ABI são vistas como restrições dominantes que bloqueiam mudanças mais profundas de segurança (por exemplo, fat pointers, sintaxe incompatível, epochs).
Cultura e insegurança por padrão
- Há várias histórias de equipes desativando sanitizers, ignorando relatórios do ASAN, recusando depuradores e tratando acesso fora dos limites como aceitável se “não travar”.
- Alguns argumentam que isso é fundamentalmente um problema de atitude: as ferramentas já existem, mas muitos desenvolvedores e organizações não as usarão a menos que haja fortes incentivos ou punições.
- Outros contrapõem que nem todo software precisa do mesmo nível de endurecimento, mas críticos respondem que qualquer aplicativo conectado à rede pode se tornar parte de uma cadeia de exploração.
Verificação de limites e trade-offs de desempenho
- Há debate recorrente sobre verificações de limites por padrão:
operator[]deveria abortar, lançar exceção ou permanecer sem verificação; a segurança deveria vir ativada por padrão com uma saída explícitaunsafe_*. - Alguns argumentam que a sobrecarga é pequena na prática (citando medições em nível de sistema) e vale a pena; outros enfatizam cargas de trabalho de HPC/embarcados, nas quais até alguns por cento de regressão importam.
- Desculpas históricas (“muito lento em 1990”) são vistas como menos válidas hoje, mas alguns ainda priorizam desempenho em vez de segurança.
CVEs, métricas e exemplo de corrida no sistema de arquivos
- Há forte discordância sobre usar contagens brutas de CVE para comparar C/C++ com Rust: a gravidade difere, e comunidades de linguagem estabelecem critérios diferentes para o que recebe um CVE.
- Exemplo: um problema TOCTOU em sistema de arquivos recebeu um CVE em Rust e uma correção publicada em blog; bibliotecas padrão de C++ corrigiram silenciosamente bugs semelhantes, mas não registraram CVEs, enquanto a especificação de C++ classifica corridas no filesystem como comportamento indefinido.
- Alguns temem que atores de C++ possam “gerenciar” contagens de CVE em vez de corrigir causas raiz; outros dizem que o problema foi tratado de forma responsável mesmo sem um CVE.
Comparações com Rust e outras linguagens
- Muitos veem Rust como um avanço qualitativo: segurança de memória por padrão,
unsafeencapsulado, melhores garantias de segurança em threads e uma cultura que trata segurança como algo primário. - Contra-argumentos: Rust ainda tem CVEs; muitos crates de Rust usam
unsafe(muitas vezes para FFI); Rust seguro enfrenta dificuldades com algumas estruturas de dados sem indirection (arenas, Rc/Arc, índices). - Alguns enfatizam que segurança de memória é apenas uma classe de vulnerabilidade; linguagens seguras em memória ainda sofrem com bugs lógicos, injeção, manejo de segredos etc., mas outros argumentam que remover uma enorme classe de bugs ainda é um “bom problema para se ter”.
Governo, pressão da indústria e futuro do C++
- Relatórios recentes de governos e grandes fornecedores pedindo uma mudança para linguagens sem insegurança de memória são vistos como pano de fundo importante; alguns leem o artigo como uma resposta defensiva.
- Debate sobre se o C++ pode realisticamente alcançar “paridade” com linguagens seguras em memória por meio de mudanças não incompatíveis e ferramentas, versus precisar de mudanças radicais e incompatíveis (epochs, subconjuntos seguros ou abordagens do tipo “Typescript for C++”).
- Muitos acreditam que o C++ legado continuará por décadas, então melhores ferramentas e modos mais seguros ainda importam, mesmo que novos projetos migrem para Rust, Go etc.
Carga cognitiva e escolhas de projeto
- Vários posts descrevem o C++ moderno como cognitivamente exaustivo: sintaxe complexa, erros pesados de templates, muitos recursos sobrepostos e UB sutil.
- Alguns dizem que ainda usam C++ apenas por causa de código legado, ecossistema ou normas do domínio (HPC, engines de jogos), e que, de outra forma, prefeririam Rust ou outras linguagens.
- No geral, o sentimento é: C++ pode ficar marginalmente mais seguro, mas, para trabalho novo do zero, muitos comentaristas o evitariam se pudessem.