Você não pode ter certeza, mas você apenas assume que eles são, até descobrir que eles não são. Houve muitos bugs em compiladores e hardware ao longo dos anos.
A maneira como estes são testados, por exemplo, um compilador, é que eles são definidos de forma muito restrita e rígida, cuidadosamente redigidos e testados com um conjunto de testes enorme para verificar a correção. Acrescente a isso a ampla base de usuários de um compilador, e mais bugs serão detectados e reportados. Um aplicativo de agendamento de consultas com o dentista, comparativamente, tem muito menos usuários e menos ainda que são capazes de detectar defeitos.
O SQLite consiste em cerca de 73 mil linhas de código, enquanto o seu conjunto de testes consiste em cerca de 91378 mil linhas de código, mais de 1250 vezes o do próprio SQLite. Espero que compiladores e outras ferramentas principais tenham proporções semelhantes. Atualmente, os processadores são projetados essencialmente com software, usando linguagens de descrição de hardware como Verilog ou VHDL, e aqueles que possuem testes de software também são executados, bem como pinos IO especializados para executar autotestes no ponto de fabricação.
Em última análise, é um jogo de probabilidade, e testes repetidos e abrangentes de cobertura permitem que você reduza a probabilidade de defeitos a um nível aceitavelmente baixo, o mesmo que em outro projeto de software.