A saída de um compilador depende do SO que você está usando?

5

Na empresa em que estou trabalhando, temos um software de gerenciamento, escrito por um programador externo. Vamos chamar o software PK. PK foi inicialmente escrito nos anos 90 usando C ++. Desde então, foi regularmente atualizado e mantido, mas em seu núcleo sempre permaneceu um software baseado na tecnologia dos anos 90.

No momento, estamos no processo de migração do Windows 7 para o Windows 10 e recebi um dos primeiros PCs com o Win 10 para testar se tudo funciona conforme o esperado no novo sistema operacional. Tudo funcionou, mas PK. PK de repente teve falhas frequentes. Eu disse ao desenvolvedor de software que há problemas com o PK no Win 10, mas mesmo depois de várias atualizações e alterações no código, ainda tivemos essas falhas. O desenvolvedor simplesmente não conseguiu descobrir por que ele travou, embora pareça estar relacionado ao gerenciamento de memória da PK.

A última gota que o desenvolvedor viu, foi compilar o software no meu Win 10-PC. Eu compilei o código-fonte com exatamente a mesma versão do Visual Studio 2008 e de repente funcionou. Não há mais falhas.

Então, minha pergunta é:

Pode ser que o mesmo código, compilado pelo mesmo compilador, produza um binário diferente dependendo da versão do Windows (Windows 7 e 10)?

E se for assim: Por quê?

    
por CKA 14.11.2018 / 09:21
fonte

3 respostas

4

Pode haver configurações do compilador diferentes entre as versões IS.

O aplicativo pode invocar comportamento indefinido e, nesse caso, tudo pode acontecer. Eu tive isso acontecendo quando alguém introduziu o UB seis meses antes, e isso causou falhas 6 meses depois em um código recentemente introduzido totalmente não relacionado.

Eu uma vez tinha um computador com RAM com defeito, e ele produzia um código de falha quando um arquivo fonte específico era compilado naquela máquina se a máquina estivesse em execução por horas.

    
por 14.11.2018 / 10:16
fonte
3

O que você está descrevendo pode acontecer com binários idênticos entre as versões do sistema operacional, se carregar dinamicamente versões diferentes, compatíveis com ABI, de suas bibliotecas dependentes. Pode até ocorrer se as bibliotecas forem idênticas byte-by-byte e o SO alterar suas políticas de gerenciamento de memória (por exemplo, fornecer um pouco mais memória do que foi solicitado pelo alocador userspace). Uma falha causada por uma falha de memória pode afetar apenas um sistema cujo alocador de memória tenha uma estratégia mais conservadora do que outra.

Você realmente verificou usando algo como, por exemplo. Dependências ou Process Explorer que todas as bibliotecas que estão sendo carregadas são as mesmas? Você inspecionou os binários com um desmontador para ver se há diferenças no código gerado? Percorra o código no depurador e veja onde ele está falhando.

    
por 14.11.2018 / 10:29
fonte
1

O código em si é apenas uma pequena quantidade do que vai para o executável final; todo o I / O e muitas outras coisas tipicamente usam funções de biblioteca , que são bastante diferentes em diferentes versões do Windows - muitas vezes até mesmo entre as várias versões do Windows 10.

Como consequência, o código poderia ser baseado em um código de biblioteca antigo que não é mais suportado, ou nunca deveria ter funcionado, mas de alguma forma funcionou; ou o código tem o UB com o qual ele escapou sob as versões antigas da biblioteca, mas não mais, etc.

Para ter certeza, você terá que analisar o código e encontrar as razões para as falhas - então você saberá se estava sempre errado e você estava com sorte (90%), ou se algum código de biblioteca não é mais compatível (10%).

    
por 15.11.2018 / 04:11
fonte