Obter um erro de compilação no código padrão ou um erro interno de compilação é mais provável do que os otimizadores estarem errados. Mas eu ouvi falar de compiladores que otimizam loops incorretamente esquecendo alguns efeitos colaterais que um método causa.
Não tenho sugestões sobre como saber se é você ou o compilador. Você pode tentar outro compilador.
Um dia eu queria saber se era o meu código ou não, e alguém me sugeriu um valgrind. Passei os 5 ou 10 minutos para executar meu programa com ele (acho que valgrind --leak-check=yes myprog arg1 arg2
fiz, mas joguei com outras opções) e imediatamente me mostrou UMA linha que é executada em um caso específico que era o problema. Então, meu aplicativo funcionou sem problemas desde então, sem falhas estranhas, erros ou comportamento estranho. valgrind ou outra ferramenta como essa é uma boa maneira de saber se é o seu código.
Nota lateral: Uma vez me perguntei por que o desempenho do meu aplicativo foi ruim. Acontece que todos os meus problemas de desempenho estavam em uma linha também. Eu escrevi for(int i=0; i<strlen(sz); ++i) {
. O sz foi de alguns mb. Por alguma razão, o compilador executava strlen todas as vezes, mesmo após a otimização. Uma linha pode ser um grande negócio. De performances a falhas