Estou trabalhando em um sistema Linux embarcado (5.10.24) e há vários aplicativos em execução nele.
Recentemente, encontrei algo estranho com um programa C como segue.
O programa C usa APIs fornecidas pela biblioteca de um SDK, que é construído com GNU -O2
, mas o programa C é construído com GNU -O3
por padrão.
Então, às vezes, é encontrado (1 em centenas de execuções) que o programa C seria acionado Segmentation Fault
em uma função no SDK.
Se o programa C for construído com o mesmo GNU -O2
que o SDK, NÃO haverá tal Segmentation Fault
acionamento nos milhares de sua execução.
Pesquisei no Google a diferença entre -O2
e -O3
e encontrei alguém mencionado que -O3
pode desencadear um bug estranho e estranho, é verdade?
Como regra geral, suponha que os principais softwares usados por milhões de pessoas estejam funcionando corretamente e que seu próprio software, desenvolvido agora por você e usado somente por você, seja a causa do problema. Encontrar bugs genuínos como esse no GCC é extremamente raro na carreira de um desenvolvedor e é um pouco como ganhar na loteria . Encontrar bugs em código proprietário de código fechado é um pouco mais comum dependendo do tamanho da organização, da base de usuários e da idade do produto.
As otimizações não afetam o código pré-compilado, apenas o código que você compilou com o GCC.
Os níveis de otimização são uma forma abreviada de adicionar vários sinalizadores de otimização . Você pode experimentá-los individualmente para ver qual deles causa problemas. Para
-O3
isso:Normalmente, níveis de otimização incompatíveis entre seu código e APIs não devem causar problemas. A convenção de chamada não é afetada. Em casos raros,
struct
o preenchimento pode ficar desalinhado, mas isso é raro.Mais comumente, as otimizações fazem uma de duas coisas:
volatile
corretamente.-O3
over-O2
. Ele ainda pode reordenar as coisas de modo que um erro existente de saturação de buffer ou erro de indexação de array agora cause um erro fatal onde não o fez originalmente.Não vi o contexto do que você leu, mas, no geral, suponha que a otimização do seu código acionará um bug no seu código, não no compilador.
É realmente verdade e pode indicar um problema do GCC.
Se o seu SDK for de código aberto e você estiver usando uma das versões suportadas do GCC, você poderá enviar um relatório de bug. Caso contrário, reduzir o nível de otimização é o caminho a percorrer.