Você está certo de que o uso de diferentes configurações para seus testes pode aumentar a chance de tropeçar acidentalmente em alguns bugs. No entanto, você deve considerar se a criação de outra plataforma de testes faz sentido a partir de uma perspectiva comercial - suspeito que você queira vender ou distribuir código útil, em vez de criar o Código Perfeito em sua torre de marfim.
I worry with the dominance of X86/AMD64 our code-base may unknowingly become less portable.
Se o seu código só roda em arquiteturas x86 ou AMD64, então há pouco uso para testar em outras arquiteturas - YAGNI se aplica aqui. Você ficaria melhor expandindo sua suíte de testes para garantir todo o comportamento documentado e eliminando a base de código de construções duvidosas com a ajuda de linters. Usar vários compiladores diferentes em configurações diferentes também é uma estratégia de baixo impacto e alto impacto para descobrir bugs (por exemplo, GCC e Clang).
Se, no entanto, você suportar explicitamente determinadas combinações de arquiteturas e sistemas operacionais, também deverá testar essas combinações.
Se, no entanto, você quiser testar mais algumas configurações de alienígenas que ainda são usadas com bastante frequência, recomendo:
-
Arquitetura: SPARC. Sistemas Operacionais: Família Solaris, Linux, família BSD. Endianness: grande, possivelmente bi. Comentários: paralelismo maciço.
-
Arquitetura: ARM. SOs: Linux, família BSD, OpenSolaris. Endianness: pouco, possivelmente bi. Comentários: usados em dispositivos incorporados, telefones celulares.
Os recursos listados podem ser testados variando os seguintes componentes na configuração:
- Endianess: arquitetura.
- Threading: SO, configurações do kernel, bibliotecas de threading, número de processadores.
- Pilha:?
- Tamanhos primitivos: diretivas de pré-processador, configurações do compilador.
- Alinhamento de estruturas: compiladores.
- Otimizações: configurações do compilador.
- Outros: compile usando diferentes implementações de libc.
Minha principal exposição à programação entre plataformas é a leitura da fonte do interpretador Perl. Aqui, os problemas de portabilidade são abordados por:
- … detectando recursos fornecidos pela implementação da libc usada, possivelmente substituindo funções customizadas. Esta informação é então registrada como um conjunto de definições pré-processador antes da compilação.
- … de forma invasiva usando macros para tipos numéricos. Os tamanhos podem ser definidos durante a compilação.
- … tornando o encadeamento opcional, pois a versão não encadeada tem melhor desempenho. No código, algumas seções são executadas somente quando compiladas com suporte a threads.
- … principalmente ignorando endianess, como isso tende a resolver-se. Endianness só se torna relevante ao fazer algo como interpretar um dado padrão de bits como um número BE de 16 bits em um sistema LE.
- … listando explicitamente as plataformas suportadas e também documentando problemas de portabilidade ou comportamentos diferentes nessas plataformas.
- ... executando uma enorme suíte de testes incl. uma tonelada de testes de regressão que são executados em uma rede de caixas CI.