A versão deste arquivo é incompatível com a versão do Windows usada - o que fazer?

Não o primeiro ano a maioria dos jogos e aplicativos são desenvolvidos apenas para sistemas operacionais de 64 bits, no entanto, até hoje (tendo em vista o fato de que muitos usuários simplesmente não entendem o que a descarga do sistema operacional não deseja reinstalar OS ou ter componentes obsoletos) dificuldades surgir com o lançamento de jogos e aplicativos - com um completo mal-entendido pelos usuários da solução desse problema

Qual é a razão: na relutância dos usuários comuns, reabastece a base de conhecimento sobre o trabalho do computador como um todo, analfabetismo de computador banal ou preguiça humana? Definitivamente, a questão é retórica.

E neste artigo, vamos considerar dois problemas de usuário muito populares com base no mesmo motivo - a ocorrência do erro de texto "A versão deste arquivo é incompatível com a versão usada pela versão do Windows" e o desejo irrestrito de iniciar o Jogo projetado para o sistema operacional de 64 bits no dispositivo com penas em um bit de 32.

Métodos Soluções

Mas no começo, deve lembrar-se de mais uma vez os usuários que vão (exatamente vá, em vez de emular) para outra pretenuação do Windows OS (32/64) sem sua instalação / reinstalação - é impossível!

Todos os vídeos e configurações disponíveis na rede são apenas uma atualização do sistema, enquanto permanece a mesma!

Isso é difícil e incompreensível para a maioria dos usuários - a questão deve ter sido tocada devido ao fato de que o erro em questão com a versão "versão deste arquivo é incompatível ..." Tem uma atitude direta para isso.

Como definir um programa de 32 bits em um sistema de 64 bits?

O texto completo do erro é o seguinte:

"A versão deste arquivo é incompatível com a versão usada pela versão do Windows. Usando as informações do sistema, determine a versão desejada do programa (32 ou 64 bits) e entre em contato com o editor de software.

Conteúdo de erro de compatibilidade.

Ou seja, todas as razões para a aparência da falha são listadas no texto do próprio erro: O usuário tenta iniciar um programa projetado em uma arquitetura de 64 bits em um sistema operacional de 32 bits.

Assim, a saída mais lógica da situação (a alternativa será discutida abaixo) é baixar o software necessário para o sistema operacional de 32 bits e usá-lo em silêncio em operação.

Também deve ser notado que, na maioria dos casos, um problema semelhante aparece no estágio de instalação de qualquer jogo ou imediatamente após o lançamento.

Se o jogo e o programa gerenciarem, é possível que o instalador seja escrito para um 64 bits e instale duas versões do jogo / programa imediatamente. Certamente, muitas situações familiares quando há 3 rótulos do produto instalado na área de trabalho, e eles são geralmente assinados na forma de um rótulo de 32 bits, "Label 64 bits" e "lançador".

Assim, para resolver simplesmente abrir o atalho desejado.

E se você tiver um sistema de 32 bits, e para o jogo que você precisa de 64 ° C?

Agora, considere a questão de como iniciar o jogo que requer um sistema operacional de 64 bits, em um sistema de 32 bits, que é um tipo de problema considerado acima. Para ele, há uma solução alternativa para a solução, mas nem sempre ajuda em Lado.

Execute alguns programas / jogos que presumem arquitetura de 64 bits também podem estar em uma máquina de 32 bits, mas sujeito a várias condições:

  • O processador inicialmente deve suportar arquitetura de 64 bits. Você pode verificar isso pelo programa CPU-Z na guia "CPU" na string "Instruções" - se indicado "x86-64", o processo atende aos requisitos mencionados, se simplesmente "x86", então, ALAS, não.
  • As características dos componentes do computador, especialmente a RAM, permitem que você use as capacidades de uma versão mais recente da descarga do sistema operacional e, consequentemente, ofereça as especificações apropriadas.

Por exemplo, se houver 2 GB de RAM para tentar ir para 64 bits sem sentido, já que o sistema operacional não funcionará corretamente.

Portanto, essa opção assume a instalação de um sistema operacional virtual convidado com um pouco de 64 bits e inicie os aplicativos / jogos necessários usando um sistema operacional virtual.

Você pode implementar isso usando o Oracle VirtualBox, que é bastante fácil de instalar, configurar e usar.

Mas aqui há uma pergunta lógica: "Qual é o ponto de usar uma máquina virtual e tentar instalar um sistema de hóspedes virtual de 64 bits se os recursos técnicos dos componentes do computador permitirem a instalação e o uso do sistema operacional Windows de 64 bits ! ".

Tal abordagem / opção seria lógica em uma situação reversa quando um sistema operacional em 32 bits deve ser emulado em um computador com um sistema operacional em 64 bits (por exemplo, para um programa que funcione corretamente apenas nesse bit).

No contexto da questão em consideração, tais ações são sem sentido, desde além de cargas adicionais, você não recebe nada substancial.

Conclusão

Então, o resumo pode ser alocado dois aspectos:

  • Se as especificações permitirem a instalação de um sistema operacional com uma arquitetura de 64 bits, instale-a.
  • Se não houver tais características, atualize os componentes e defina o sistema operacional de 64 bits.

Tentando contornar as restrições arquitetônicas existentes, exceto por problemas adicionais em sua cabeça, você não compra.

Computadores modernos na maioria dos casos são fornecidos com o sistema operacional Windows 10 64 bits instalado. Mesmo os modelos orçamentários já têm 3 e mais GB de RAM, o que permite ao sistema usar o sistema toda a energia do processamento de dados de 64 bits.

Mais informações sobre os benefícios de 64 bits mais de 32 bits você pode ler em nossos benefícios do artigo "da transição para 64 bits".

Mas, não importa como um sistema atraente de 64 bits era atraente, muitas vezes o usuário simplesmente não tem um programa de 64 bits à sua disposição, com o qual há muito tempo trabalhando e que está completamente satisfeito com ele, porque O fabricante simplesmente não soltou ela. Como regra geral, esses programas são instalados no Windows para uma pasta separada \ Arquivos de Programas (X86) e seu lançamento é realizado no modo de 32 bits.

Como em programas iniciais de 64 bits no modo de compatibilidadeSe durante o processo de inicialização, o programa fornece um erro ou não iniciar nada, e no Windows 32 bits funcionou sem problemas, há uma chance de iniciá-lo em um modo especial, que os desenvolvedores chamavam de "modo de compatibilidade".

Como em programas iniciais de 64 bits no modo de compatibilidadePara fazer isso, no Windows 7, clique com o botão direito do mouse no atalho do programa desejado e selecione Propriedades no menu de contexto. Na janela que abre, vá para a guia Compatibilidade e selecione o "Executar um programa no modo de compatibilidade com ..." e na lista suspensa, especifique a opção do sistema para iniciar. Clique no botão OK. Depois disso, tente executar seu programa.

Além disso, no menu de contexto, o condutor também faz sentido tentar resolver automaticamente a tarefa clicando na linha "Correção de Problema de Compatibilidade" - no Windows 7.

Como em programas iniciais de 64 bits no modo de compatibilidadeNo Windows 10, ao configurar as startups no modo compatível, na guia Compatibilidade, há um botão separado "Executar um problema de compatibilidade". Depois disso, você será oferecido ou usará os parâmetros recomendados, ou para diagnosticar o programa.

Como em programas iniciais de 64 bits no modo de compatibilidadeSe o programa não iniciar depois disso, vale a pena abordar o problema mais bem e tentar as opções especificadas no site oficial da Microsoft.

Um método mais radical de iniciar o programa é instalá-lo e usar em uma máquina virtual com Windows 7 32 bits instalados. Mais informações, como instalar e configurar uma máquina virtual Você pode ler em nosso artigo "Como criar e configurar um sistema operacional virtual no PC?".

Veja também:

Uma foto: Fabricantes, Pexels.com.

Autor Mensagem
 Pastore.
Status do Membro: desligada Inscrição: 03/12/2011.

Peçoia-me muito se não naquele ramo criado o tópico. Em "jogos" como jogos específicos são discutidos. E eu tenho mais pergunta de compatibilidade de software. É possível usar os jogos 32 bits em um ambiente de 64 bits? Eu não sou especialista - eu não entendo. Eles tinham amigos do outro com uma criança. E para que ele não interfira na mesa para sentar para incluir o computador. E eu deixei jogos em que ele costumava jogar. Eu naturalmente não os coloquei em um novo. E ele explicou que eles não iriam. O que em vão um computador entupido. Pergunte por não que ninguém tivesse. E agora decidi consultar - talvez haja apenas apenas na perda de velocidade. Em uma palavra, explique, Pliz, que não é muito preguiçoso. O jogo é simples: Hoi (então você quer dizer dia da vitória, medalha de honra e ainda para a filha da namorada comprou uma missão sobre a menina e a ilha). OC - ​​Win 7 64 Premium.ps Eu estava procurando na internet, mas algum tipo de informação é geral, no sonovnm eles escrevem que menores de 64 bits você precisa procurar por antivírus, lenha e coisas semelhantes. Eu não encontrei nada sobre o jogo.

Anúncio
Parceiro
 Felizes.
Status do Membro: desligada Inscrição: 24/08/2008. Uma foto: 0

Os próprios programas, como 32 bits, são totalmente compatíveis com um sistema operacional de 64 bits. Mas jogos de concreto ... medalha de honra deve ir com precisão ...

_________________https: //github.com/koshak1013/huananzhix99_bios_mods.
 OPV88.
Status do Membro: desligada Entrada: 22/05/2010 Royalty Free Royalty Free Vetor: Moscou

Pastore escreveu (A):

No sonovnm eles escrevem que com menos de 64 bits você precisa procurar por antivírus, lenha e coisas semelhantes

True, muitas vezes para x64 colocar outras versões. Os programas quase todos vão dos 32 bits (por a dizer fortemente específicos), mas a lenha geralmente é necessária separadamente por 64 contrações.

Pastore escreveu (A):

É possível usar os jogos 32 bits em um ambiente de 64 bits?

Quase todo mundo vai. Geralmente não apenas jogos muito antigos ...

Pastore escreveu (A):

Dia da vitória

Vai.

Pastore escreveu (A):

Medalha de Honra

Vai.

Pastore escreveu (A):

E para sua namorada filha comprou uma missão sobre uma garota e uma ilha

O nome seria bom ouvir

_________________Origin - AcccurcedSteam - OPV1988 para encomendar: https://pavel-orlov.com
 Pastore.
Status do Membro: desligada Inscrição: 03/12/2011.

Obrigado!

Opv88 escreveu (A):

Pastore escreveu (A):

E para sua namorada filha comprou uma missão sobre uma garota e uma ilha

O nome seria bom ouvir

Ilha Misteriosa.

http://questgame.ru/return_mysterious_island.php.

E o fato de que os jogos não suportam o DirectX 11 também não desempenha o papel?

Última edição por Pastore 04/17/2011 20:54, editou 1 vez no total.
 Felizes.
Status do Membro: desligada Inscrição: 24/08/2008. Uma foto: 0
 Pastore.
Status do Membro: desligada Inscrição: 03/12/2011.

Oh, obrigado. Desculpe, o cara desapareceu em vão. Como você aqueceu tão rapidamente? Especificamente perguntado se 64 bits vão?

 Felizes.
Status do Membro: desligada Inscrição: 24/08/2008. Uma foto: 0

Pastore escreveu (A):

Como você aqueceu tão rapidamente? Especificamente perguntado se 64 bits vão?

:-)

No Google, implantou implantou "retornar à misteriosa ilha x64"

Link Pontal na primeira página

:-)Adicionado após 46 segundos:

Pastore escreveu (A):

Desculpe, o cara desapareceu em vão.

E agora estou satisfeito

: rolar: Adicionado após 59 segundos:

Pastore escreveu (A):

E o fato de que os jogos não suportam o DirectX 11 também não desempenha o papel?

Não desempenha nenhum papel.

_________________https: //github.com/koshak1013/huananzhix99_bios_mods.
 V00d00ley.
Status Júnior: desligada Entrada: 24/03/2004 Vida: Rússia, águia

No 64 bits: 1. Os programas que estão em suas bibliotecas de composição de 16 bits ou arquivos executáveis ​​não serão enviados diretamente para DOS Games.2. Qualquer software de modo kernel (do motorista do dispositivo físico para starfors) deve ter uma assinatura digital. Essa. Alguns jogos licenciados mais antigos, por exemplo, não serão capazes de entregar seu driver de proteção e, com antigos starfors, um jogo licenciado provavelmente não irá. Qualquer software de 32 bits é realizado sob o sistema operacional de 64 bits ligeiramente mais lento.

_______________Life é uma merda, pegue um capacete
 CRAFT61.
Status do Membro: desligada Inscrição: 10/16/2010.

Pastore escreveu (A):

Peçoia-me muito se não naquele ramo criado o tópico. Em "jogos" como jogos específicos são discutidos. E eu tenho mais pergunta de compatibilidade de software. É possível usar os jogos 32 bits em um ambiente de 64 bits? Eu não sou especialista - eu não entendo. Eles tinham amigos do outro com uma criança. E para que ele não interfira na mesa para sentar para incluir o computador. E eu deixei jogos em que ele costumava jogar. Eu naturalmente não os coloquei em um novo. E ele explicou que eles não iriam. O que em vão um computador entupido. Pergunte por não que ninguém tivesse. E agora decidi consultar - talvez haja apenas apenas na perda de velocidade. Em uma palavra, explique, Pliz, que não é muito preguiçoso. O jogo é simples: Hoi (então você quer dizer dia da vitória, medalha de honra e ainda para a filha da namorada comprou uma missão sobre a menina e a ilha). OC - ​​Win 7 64 Premium.ps Eu estava procurando na internet, mas algum tipo de informação é geral, no sonovnm eles escrevem que menores de 64 bits você precisa procurar por antivírus, lenha e coisas semelhantes. Eu não encontrei nada sobre o jogo.

Eu uso o Windows 7 Home Premium 64-bit por um ano e meio. De acordo com sua própria experiência, posso assegurar que todos os jogos modernos (e não muito) são lançados e operados em 100%! Até que conheci não funcionando! E quanta memória você tem?

_________________ ⚡ AMD 5950x⚡ Aorus Master X570⚡ Aorus Master RTX 3090 ⚡ 64 GB DDR4⚡ SB AE-9 + FOSTEX TH610 (RA-1572 + B & W 706 S2) ⚡ pg27UQ 4K + 144Hz + HDR
 Pastore.
Status do Membro: desligada Inscrição: 03/12/2011.

CRAFT61 escreveu (A):

E quanta memória você tem?

3 GB.

 OPV88.
Status do Membro: desligada Entrada: 22/05/2010 Royalty Free Royalty Free Vetor: Moscou

2. Qualquer software de modo de kernel (do motorista do dispositivo físico para starfors) deve ter uma assinatura digital. Essa. Alguns velhos jogos licenciados, por exemplo, não serão capazes de entregar seu driver de proteção e, com antigos starfors, um jogo licenciado provavelmente não irá.

No final, a verificação pode ser ignorada pela inicialização com F8 no modo de assinaturas desativadas e se registrou em cmd

Bcdedit -set loadoptions "Disable_Integrity_Checks"

Bcdeditit -set loadoptions "ddisable_integrity_checks"

3. Qualquer software de 32 bits é realizado sob o sistema operacional de 64 bits ligeiramente mais lento.

Na verdade, este é um mito inspirado pelo fato de que em x64 b

о

A descarga inferior do endereçamento op ... mito não é confirmado.

_________________Origin - AcccurcedSteam - OPV1988 para encomendar: https://pavel-orlov.com
 Voe ou morra
Bloqueado BloqueadoStatus: desligada Inscrição: 08.12.2009.

Pastore escreveu (A):

3 GB.

Por que então x64 em geral?

 Dzirt2005.
Status do Membro: desligada Inscrição: 02/18/2010. Uma foto: 2

Opv88 escreveu (A):

3. Qualquer software de 32 bits é realizado sob o sistema operacional de 64 bits ligeiramente mais lento.

Na verdade, este é um mito inspirado pelo fato de que em x64 b

о

A descarga inferior do endereçamento op ... mito não é confirmado.

Este não é um mito e dentro deste estado das coisas não é de todo

о

Couro a descarga do endereçamento op, apenas mais um pouco. E associado a essa necessidade de alternar o contexto da execução do processador ao chamar as funções do sistema. Mas na prática, estas reduções de 0,5-1-2-2% na velocidade e também "no olho" é irrealista. Então "um pouco mais lento" é bastante normal.

 OPV88.
Status do Membro: desligada Entrada: 22/05/2010 Royalty Free Royalty Free Vetor: Moscou

E associado a essa necessidade de alternar o contexto da execução do processador ao chamar as funções do sistema.

A descarga do sistema operacional não está relacionada à descarga do processador. Não confunda o conceito.

Apenas outro pouco

O bit é o número de uma malha de descarga. Bem, ou o número de descargas numéricas necessárias para registrar o número. Neste caso, para registrar o endereço do OP. Como ela pode ser diferente? O sistema de endereçamento no X64, em princípio, é o mesmo. Consequentemente, em x86 (36 bits) endereçado ~ 2 ^ 32, isto é. 4GB, em X64 - 2 ^ 64.

_________________Origin - AcccurcedSteam - OPV1988 para encomendar: https://pavel-orlov.com
 Dzirt2005.
Status do Membro: desligada Inscrição: 02/18/2010. Uma foto: 2

Opv88 escreveu (A):

E associado a essa necessidade de alternar o contexto da execução do processador ao chamar as funções do sistema.

A descarga do sistema operacional não está relacionada à descarga do processador. Não confunda o conceito.

Apenas outro pouco

O bit é o número de uma malha de descarga. Bem, ou o número de descargas numéricas necessárias para registrar o número. Neste caso, para registrar o endereço do OP. Como ela pode ser diferente? O sistema de endereçamento no X64, em princípio, é o mesmo. Consequentemente, em x86 (36 bits) endereçado ~ 2 ^ 32, isto é. 4GB, em X64 - 2 ^ 64.

Eu mesmo entendi o que eu disse?

:-)

Vou tentar explicar simplesmente nos seus dedos, porque você, como pessoa não está familiarizada com a programação, será difícil para mim explicar em termos técnicos.

Suponha que agora algum programa de 32 bits seja realizado, algo faz (não importa o que). O processador é naturalmente no modo "32 bits" (por exemplo, os registros de 32 bits, lançando a memória de 32 bits, etc., etc.) Isso é chamado de "contexto de execução". Agora, o programa se refere à função do sistema (lendo o arquivo, entrada do teclado, mas qualquer coisa). Como o sistema é de 64 bits, então o processador, com essa chamada, você precisa traduzir para o modo "64 bits" (isso é chamado de "alternar o contexto de execução"). A operação é embora justa, mas não completamente livre. E ao retornar da chamada do sistema, você precisa mudar o contexto da execução novamente e, às vezes, converter dados de um formato para outro. Aqui está a perda de desempenho. Repito - "para vê-los" para vê-los, eles são improváveis ​​de serem 2% no trabalho regular, exceto em alguns casos degenerados.

Que eu queria quis dizer quando escrevi "apenas outro pouco", no sentido de não ser o mesmo. O que você entendeu é um mistério?

:-)
 4e_alex.
Status do convidado avançado: desligada Inscrição: 03.12.2004.

Não há processadores de regime de 32 bits. Win X64 usa o modo longo, um 64 ou compatibilidade é atribuído a cada fluxo (isso não é o mesmo que o modo protegido, no qual o Win X86 funciona), a chave de contexto é quase livre. Em alguns casos, um programa de 32 bits pode funcionar mais rápido sob o X64 devido às razões não relacionadas.

_________________Enough Banter Expository! AGORA LUTAMOS COMO HOMENS! E senhoras! E senhoras que se vestem como homens!
 OPV88.
Status do Membro: desligada Entrada: 22/05/2010 Royalty Free Royalty Free Vetor: Moscou

Como você gosta de uma pessoa que não esteja familiarizada com a programação

Eu vou dizer segredo: eu trabalho como programador e diploma :)Embora eu entenda que eu não posso saber muito, mas essas santas verdades do software do sistema e dos sistemas sabem tudo, IMHO ...
Adicionado após 1 minuto 13 segundos:

O processador é naturalmente em modo "32 bits"

Como observado corretamente 4e_alex. Não existe tal regime. Além disso seus argumentos - absurdo.
_________________Origin - AcccurcedSteam - OPV1988 para encomendar: https://pavel-orlov.com
 Dzirt2005.
Status do Membro: desligada Inscrição: 02/18/2010. Uma foto: 2

Opv88 escreveu (A):

Como observado corretamente 4e_alex. Não existe tal regime. Além disso seus argumentos - absurdo.

Naturalmente, não há nenhum regime especial, escrevi nas citações de citações - "32 bits" modo e modo "64 bits". Como você pretende explicar os modos do processador para uma pessoa, nada neles não entende?

Ps: e absurdo ou não - é claro que você sabe mais ... você tem um diploma

:-)
 Krashmar.
Status do Membro: desligada Introdução: 16/04/2011.

Citar:

Mas na prática, eles vêem esses 0,5-1-2% da redução na velocidade e também "no olho" é irreal

Há um Q6600 @ 3700 / GTX470 @ 750 / W7 /. Instalou um brinquedo velho

Mais escuro dos dias.

. Os retardes monstruosos são periodicamente manifestados. Eu escrevo o conflito 32/64, já que não vejo outras razões para tal comportamento.

Se sim, aparentemente, em alguns casos longe de uma queda de 1,5-2% de desempenho.

 0VZ.
Status do Membro: desligada Inscrição: 27/04/2011.

Talvez em geral o conflito do velho jogo e o novo sistema operacional (e não importa, 32 ou 64 bits).

Eu, por exemplo, no C2D E6300 sob XP-32BIT ficou o primeiro X-COM (DOS. Versão)

:)

Então ele é geralmente 386 CPUs nos requisitos.

_________________ Melhor resfriamento para o computador - sistema dividido! :)

-

Quem está agora na conferência

Agora você procura este fórum: sem usuários registrados e convidados: 7

Vocês você não pode Comece as cabeças você não pode responder a mensagens você não pode Edite suas postagens você não pode Exclua suas postagens você não pode Adicionar Anexos

Laboratório

anotação

O artigo discute as etapas principais que garantem a transferência correta de aplicativos do Windows de 32 bits para sistemas Windows de 64 bits. Embora o artigo seja focado em desenvolvedores usando o idioma SI / C ++ no Visual Studio 2005/2008, será útil para outros desenvolvedores planejando transferir seus aplicativos em sistemas de 64 bits.

Introdução

O artigo descreve os destaques enfrentados pelos desenvolvedores que planejam migrar programas de 32 bits em sistemas de 64 bits. Claro, a lista de perguntas consideradas não está cheia, mas quero esperar que ao longo do tempo a versão avançada deste artigo seja oferecida. O autor será grato a comentários, comentários e questões que melhorarão a informatividade deste artigo.

1. Passo primeiro. 64-praias são diferentes.

Vamos descobrir

Como parte da arquitetura da tecnologia de computação sob o termo "

64-bit

"Entenda inteiros de 64 bits e outros tipos de dados com um tamanho de 64 bits. Sob os sistemas" 64 bits ", arquiteturas de microprocessadores de 64 bits (por exemplo, em64T, IA-64) ou sistemas operacionais de 64 bits (por exemplo , Windows XP Professional X64 Edition) [

1

].

AMD64 (é x86-64, Intel 64, EM64T, X64) - Arquitetura de microprocessador de 64 bits e o conjunto correspondente de instruções desenvolvidas pela AMD [

2

]. Este conjunto de instruções foi licenciado pela Intel intitulado EM64T (Intel64). A arquitetura AMD64 é uma expansão de arquitetura X86 com compatibilidade plena para trás. A arquitetura tornou-se difundida como uma base de computadores pessoais e estações de trabalho.

IA-64 - Arquitetura de microprocessador de 64 bits, desenvolvido em conjunto pelas empresas Intel e Hewlett Packard [

3

]. Implementado em Itanium e Itanium 2 microprocessadores [

4

]. A arquitetura é usada principalmente em servidores multiprocessadores e sistemas de cluster.

AMD64 e IA-64 são duas diferentes arquiteturas de 64 bits não são compatíveis entre si. Portanto, os desenvolvedores devem decidir imediatamente se é necessário suportar essas duas arquiteturas ou apenas um. Na maioria dos casos, se você não estiver desenvolvendo software altamente especializado para sistemas de cluster ou não implementar seus DBMs de alto desempenho, com uma alta probabilidade, você precisa implementar o suporte de apenas a arquitetura AMD64, que foi significativamente maior que a IA- 64. Isso é especialmente verdadeiro para o software para o mercado de computadores pessoais, que é quase 100% envolvido na arquitetura AMD64.

Além disso, no artigo, falaremos apenas sobre a arquitetura de AMD64 (EM64T, X64), já que seu uso é agora o mais relevante para desenvolvedores de software de aplicativos.

Falando sobre várias arquiteturas, deve ser mencionado sobre o conceito "

Modelo de dados

". O modelo de dados deve ser entendido como a proporção das dimensões dos tipos adotadas dentro do ambiente de desenvolvimento. Para um sistema operacional, existem vários desenvolvimentos que possuem diferentes modelos de dados. Mas apenas um modelo é prevalente, o hardware mais apropriado e ambiente de software prevalece. Um exemplo é 64-bit o sistema operacional Windows em que o modelo de dados nativo é

Llp64.

. Mas para compatibilidade, o sistema Windows de 64 bits suporta a execução de programas de 32 bits que funcionam no modo de modelo de dados

Ilp32ll.

. A Tabela N1 fornece informações sobre modelos de dados básicos.

Tabela N1. Modelo de dados

O modelo de dados aplicado ao processo de desenvolvimento de aplicativos de 64 bits, como no código do programa é necessário levar em conta o conteúdo do bits dos dados usados ​​[

5

].

2. Passo segundo. Descubra se você precisar de uma versão de 64 bits do seu produto

Iniciar o desenvolvimento de sistemas de 64 bits segue a partir da pergunta "Precisamos rebelar seu projeto para um sistema de 64 bits?". Você deve definitivamente responder a essa pergunta, mas não com pressa, pensando. Por um lado, você pode ficar atrás de nossos concorrentes, a tempo sem oferecer decisões de 64 bits. Por outro lado, é desperdiçar gastar tempo em uma aplicação de 64 bits que não dará nenhuma vantagem competitiva.

Nós listamos os principais fatores que ajudarão você a escolher.

2.1. Duração das aplicações de ciclo de vida

Não crie uma versão de 64 bits do aplicativo com um ciclo de vida curta. Graças ao subsistema

Wow64.

Aplicativos antigos de 32 bits funcionam muito bem em sistemas Windows de 64 bits e, portanto, para fazer um programa de 64 bits, que parará suportado após 2 anos, ele não tem o significado [

6

]. Além disso, a prática mostrou que a transição para versões de 64 bits do Windows foi atrasada e a maioria de seus usuários no curto prazo usará apenas uma versão de 32 bits da solução de software.

Se o desenvolvimento de longo prazo e o suporte de software de longo prazo estiver planejado, você deve começar a trabalhar em uma versão de 64 bits de sua solução. Isso pode ser feito lentamente, mas tenha em mente que quanto mais tempo você não terá uma opção de 64 bits com pleno direito, mais dificuldades poderão surgir com o suporte de tal aplicativo instalado nas versões de 64 bits do Windows.

2.2. Intensidade de recursos do aplicativo

O programa de recarga para o sistema de 64 bits permitirá que ele use enormes quantidades de RAM, bem como a velocidade de sua operação em 5-15%. O levantamento de 5-10% ocorrerá devido ao uso das capacidades arquitetônicas do processador de 64 bits, por exemplo, mais registros. Outro aumento de velocidade de 1% -5% é causado pela falta de interlayer wow64, que transmite a API chama entre aplicativos de 32 bits e um sistema operacional de 64 bits.

Se o seu programa não funcionar com grandes quantidades de dados (mais de 2GB) e sua velocidade não é crítica, a transição para 64 bits no futuro próximo, o sistema não é tão relevante.

By the way, mesmo aplicativos simples de 32 bits, podem obter uma vantagem de seu lançamento em um ambiente de 64 bits. Você provavelmente sabe que o programa coletado com a tecla / Largeaddressarware: Sim pode destacar até 3 gigabytes se o sistema operacional Windows de 32 bits estiver sendo executado com a tecla / 3GB. O mesmo programa de 32 bits em execução em um sistema de 64 bits pode destacar quase 4 GB de memória (na prática de cerca de 3,5 GB).

2.3. Desenvolvimento de bibliotecas

Se você estiver desenvolvendo bibliotecas, componentes ou outros elementos com os quais os desenvolvedores de terceiros criarem seu software, você deve mostrar a eficiência na criação de uma versão de 64 bits de seus produtos. Caso contrário, seus clientes interessados ​​na liberação de versões de 64 bits serão forçados a procurar soluções alternativas. Por exemplo, alguns desenvolvedores de proteção de software e hardware responderam com um grande atraso na aparência de programas de 64 bits, o que forçou um número de clientes a procurar outras ferramentas para proteger seus programas.

Uma vantagem adicional do lançamento de uma versão de 64 bits da biblioteca é que você pode vendê-lo como um produto separado. Assim, seus clientes que querem criar aplicativos de 32 e 64 bits serão forçados a adquirir 2 licenças diferentes. Por exemplo, essa política é usada por corporação espacial ao vender a biblioteca de acis espaciais.

2.4. A dependência do seu produto de bibliotecas de terceiros

Antes de planejar a criação de versões de 64 bits do seu produto, descobrir se há variantes de 64 bits de bibliotecas e componentes usados ​​nele. Descubra também o que uma política de preços em relação à versão de 64 bits da biblioteca. Tudo isso pode ser encontrado visitando o site do desenvolvedor da biblioteca. Se não houver suporte, procure antecipadamente soluções alternativas que suportem sistemas de 64 bits.

2.5. Disponibilidade de aplicações de 16 bits

Se os módulos de 16 bits ainda estiverem presentes em suas decisões, é hora de se livrar deles. A operação de aplicativos de 16 bits em versões de 64 bits do Windows não é suportada.

Aqui, um ponto deve ser explicado aqui associado ao uso de instaladores de 16 bits. Eles ainda são usados ​​para definir alguns aplicativos de 32 bits. Um mecanismo especial foi criado, que na mosca substitui um número dos mais populares instaladores de 16 bits para versões mais recentes. Isso pode causar crença incorreta de que os programas de 16 bits ainda funcionam em um ambiente de 64 bits. Lembre-se, isso não é.

2.6. Disponibilidade de código no montador

Não se esqueça que usar uma grande quantidade de código no montador pode melhorar significativamente o custo de criar uma versão de 64 bits do aplicativo.

Pesando todos os fatos listados, tudo para e contra, aceite a decisão se deve transferir seu projeto para sistemas de 64 bits. E se sim, então vamos mais longe.

3. Passo três. Ferramentas

Se você decidiu desenvolver uma versão de 64 bits do seu produto e estiver pronta para gastar tempo neste momento, isso não garante sucesso. O fato é que você deve ter todas as ferramentas necessárias e pode haver incidentes desagradáveis ​​aqui.

O mais simples, mas também insuperável é o problema da falta de um compilador de 64 bits. O artigo é escrito em 2009, mas ainda não há compilador de construtor C ++ de 64 bits do Codgear [

7

]. Sua liberação é esperada apenas até o final deste ano. É impossível ignorar um problema semelhante, a menos que seja claro que reescreva todo o projeto, por exemplo, usando o Visual Studio. Mas se tudo estiver claro com a falta de um compilador de 64 bits, outros problemas semelhantes podem se tornar mais secretos e sair no estágio do trabalho na transferência do projeto para uma nova arquitetura. Portanto, quero aconselhar um estudo antecipadamente se existem todos os componentes necessários que serão necessários para implementar a versão de 64 bits do seu produto. Surpresas desagradáveis ​​podem notar você.

Claro, listar tudo o que pode ser necessário para o projeto É impossível aqui, mas ainda oferece uma lista que irá ajudá-lo a se levantar e pode ser lembrado sobre outros pontos que são necessários para implementar seu projeto de 64 bits:

3.1. Disponibilidade de um compilador de 64 bits

É difícil dizer algo sobre a importância da presença de um compilador de 64 bits. Ele só precisa ser.

Se você planeja desenvolver aplicativos de 64 bits usando a versão mais recente (no momento do artigo) Visual Studio 2008, a seguinte tabela N2 ajudará a ajudar a determinar qual versão do Visual Studio você precisa.

Tabela N2. As possibilidades de várias edições do Visual Studio 2008

3.2. Disponibilidade de computadores de 64 bits executando sistemas operacionais de 64 bits

Você pode certamente usar máquinas virtuais para iniciar aplicativos de 64 bits em técnicas de 32 bits, mas é extremamente inconveniente e não fornecerá o nível necessário de testes de teste. É desejável que pelo menos 4-8 gigabytes de RAM sejam instalados nas máquinas.

3.3. Disponibilidade de variantes de 64 bits de todas as bibliotecas usadas

Se as bibliotecas forem apresentadas nos códigos de origem, a configuração do projeto de 64 bits deve estar presente. Independentemente envolvido na modernização da biblioteca para sua assembléia sob o sistema de 64 bits, pode ser uma ocupação ingrata e complexa, e o resultado pode ser não confiável e contendo erros. Você também pode interromper esses contratos de licença. Se você estiver usando bibliotecas na forma de módulos binários, você também deve descobrir se os módulos de 64 bits existem. Você não poderá usar DLLs de 32 bits dentro de um aplicativo de 64 bits. Você pode criar uma cintagem especial através do com, mas esta será uma tarefa grande e desafiadora separada [

8

]. Observe também que a aquisição de uma versão de 64 bits da biblioteca pode custar dinheiro adicional.

3.4. Falta de código embutido na montadora

O Visual C ++ não suporta o montador embarcado de 64 bits. Você deve usar ou um montador externo de 64 bits (por exemplo, MASM) ou ter a realização da mesma funcionalidade na linguagem SI / C ++ [

9

].

3.5. Modernização da metodologia de teste

Processamento significativo de metodologia de teste, modernização de testes unitários, o uso de novas ferramentas. Isso será anunciado em mais detalhes abaixo, mas não se esqueça de levar em conta isso no estágio de avaliar o tempo gasto na migração do aplicativo para o novo sistema [

dez

].

3.6. Novos dados para testes

Se você estiver desenvolvendo aplicativos intensivos em recursos que consomem uma grande quantidade de RAM, então você precisa cuidar do reabastecimento do banco de dados de dados de entrada de teste. Com o teste de carregamento de aplicativos de 64 bits, é aconselhável ir além de 4 gigabytes de memória consumidos. Muitos erros podem aparecer apenas sob tais condições.

3.7. Disponibilidade de sistemas de proteção de 64 bits

O sistema de proteção usado deve suportar sistemas de 64 bits no valor total que você precisa. Por exemplo, Aladdin lançou rapidamente os drivers de 64 bits para suportar chaves de hardware do HASP. Mas muito longa falta do sistema de proteção automática de arquivos binários de 64 bits (envelope HASP). Assim, o mecanismo de proteção tinha que ser implementado de forma independente dentro do código do programa, que foi uma tarefa complexa adicional que requer qualificações e tempo. Não se esqueça de pontos semelhantes relacionados a assegurar proteção, sistema de atualização e assim por diante.

3.8. Instalador

É necessário ter um novo instalador capaz de instalar totalmente aplicativos de 64 bits. Eu quero imediatamente avisar sobre um erro tradicional. Esta é a criação de instaladores de 64 bits para instalar produtos de software de 32/64 bits. Preparando a versão de 64 bits do aplicativo, os desenvolvedores geralmente querem trazer "64 bits" para o absoluto. E criar um instalador de 64 bits, esquecendo que os usuários de um sistema operacional de 32 bits, tal pacote de instalação simplesmente não será iniciado. Observamos que não iniciará um aplicativo de 32 bits incluído na sala de distribuição, juntamente com 64 bits, ou seja, o instalador em si. Afinal, se a distribuição for um aplicativo de 64 bits, em um sistema operacional de 32 bits, é claro, não será iniciado. A coisa mais exigente disso é que o usuário não será capaz de adivinhar o que está acontecendo. Ele simplesmente verá um pacote de instalação que não possa ser lançado.

4. Passo em quarto. Configurando um projeto no Visual Studio 2005/2008

Criando uma configuração de projeto de 64 bits no Visual Studio 2005/2008 parece simples o suficiente. As dificuldades vão marcar você no estágio de montar uma nova configuração e erros de pesquisa nele. Para criar a mesma configuração de 64 bits, basta executar as seguintes 4 etapas:

Execute o gerenciador de configuração conforme mostrado na Figura N1:

Figura 1. Iniciando o Gerenciador de Configuração

No Configuration Manager, selecione Suporte para uma nova plataforma (Figura N2):

Figura 2. Criando uma nova configuração

Selecione a plataforma de 64 bits (x64) e selecione as configurações da versão de 32 bits como base (Figura N3). As configurações que afetam o modo de montagem do ambiente do Visual Studio ajustarão o SAM.

Figura 3. Selecione X64 como uma plataforma e tome a base da configuração Win32

Adicionar uma nova configuração é concluída e podemos selecionar uma opção de configuração de 64 bits e embarcar em uma compilação de um aplicativo de 64 bits. Selecionar uma configuração de 64 bits para montagem é mostrada na Figura N4.

Figura 4. A configuração de 32 e 64 bits está agora disponível.

Se você tiver sorte, então você não será capaz de se envolver na criação de um rascunho de 64 bits. Mas depende fortemente do projeto, sua complexidade e o número de bibliotecas usadas. A única coisa que deve ser alterada imediatamente é o tamanho da pilha. Se a sua pilha padrão for usada em seu projeto, ou seja, 1 megabyte, ou seja, faz sentido configurá-lo em 2 megabytes para uma versão de 64 bits. Isso não é necessariamente, mas é melhor progredir antecipadamente. Se você tiver um tamanho de pilha, diferente do tamanho padrão, isto é, faz sentido torná-lo para uma versão de 64 bits 2 vezes mais. Para fazer isso, nas configurações do projeto, localize e modifique a pilha de tamanho de reserva e a pilha Configurações de tamanho.

5. Passo cinco. Compilação do aplicativo

Seria bom, aqui contar sobre problemas típicos decorrentes do estágio de compilação de uma configuração de 64 bits. Considere quais problemas surgem com bibliotecas de terceiros, dizem que o compilador no código associado às funções do WinAPI não permitirá mais o ponteiro no tipo longo e você precisará atualizar seu código e usar o tipo Long_ptg. E muitos outros. Infelizmente, isso muito e erros são tão diversos que não há possibilidade de declará-lo dentro de um artigo e até mesmo, talvez, livros. Você terá que ver todos os erros que darão ao compilador e novos avisos que não foram anteriormente e em cada caso individual para descobrir como atualizar o código.

Parcialmente, a vida pode coleta de referências aos recursos dedicados ao desenvolvimento de aplicações de 64 bits:

http://www.viva64.com/links/64-bit-development/

. A coleção é constantemente atualizada e o autor será grato aos leitores se eles lhe enviarão referências aos recursos que, em sua opinião, merecem atenção.

Vamos habitar aqui apenas nos tipos que podem ser de interesse para os desenvolvedores ao migrar aplicativos. Esses tipos são apresentados na tabela N3. A maioria dos erros de compilação será associada ao uso desses tipos.

Um tipo Speatiput speatformex32 / x64 Observação
int. 32/32. Tipo básico. Em sistemas de 64 bits permaneceram 32 bits.
Longo. 32/32. Tipo básico. Em sistemas Windows de 64 bits permaneceram 32 bits. Observe que em sistemas Linux de 64 bits, esse tipo foi expandido para 64 bits. Não se esqueça se você desenvolver um código que funcione com compilação para Windows e para sistemas Linux.
Tamanho_t. 32/64. Tipo básico não salvo. O tipo de tipo é escolhido de forma que ele possa ser gravado no tamanho máximo da matriz teoricamente possível. O tipo de tamanho_t pode ser colocado com segurança um ponteiro (a exclusão é ponteiros para a função de classes, mas este é um caso especial).
ptrdiff_t. 32/64. Semelhante ao tipo tamanho_t, mas é um sinal. O resultado de uma expressão, onde um ponteiro é deduzido do outro (PTR1-PTR2), basta terá o tipo Ptrdiff_t.
Ponteiro 32/64. O tamanho do ponteiro depende diretamente da descarga da plataforma. Tenha cuidado ao tornar os números para outros tipos.
__int64. 64/64. Um tipo icônico de 64 bits.
DWORD. 32/32. Tipo não assinado de 32 bits. Anunciado em windef.h como: dword longo não assinado de typedef;
DWORDLONG. 64/64. Tipo não assinado de 64 bits. Anunciado em winnt.h como: typedef ulonglong dwordlong;
DWORD_PTR. 32/64. O tipo não resolvido em que o ponteiro pode ser colocado. Anunciado em basetsd.h como: typedef ulong_ptr dword_ptr;
DWORD32. 32/32. Tipo não assinado de 32 bits. Anunciado em basetsd.h como: typedef não assinado int dword32;
DWORD64. 64/64. Tipo não assinado de 64 bits. Anunciado em basetsd.h como: typedef não assinado __int64 dword64;
Half_ptr. 16/32. Meio ponteiro. Anunciado em basetsd.h Como: #IfDef _win64 typedef int half_ptr; #Else typedef curto half_ptr; #endif
Int_ptr. 32/64. Um tipo icônico em que o ponteiro pode ser colocado. Anunciado em basetsd.h como: #If definido (_win64) typedef __int64 int_ptr; #Else typedef int int_ptr; #endif
Longo. 32/32. O tipo icônico permaneceu 32 bits. Portanto, em muitos casos, Long_Ptr deve agora ser usado. Anunciado em winnt.h como: typedef longo longo;
Long_ptr. 32/64. Um tipo icônico em que o ponteiro pode ser colocado. Anunciado em basetsd.h como: # SEF definido (_win64) typedef __int64 long_ptr; #Else typedef long_ptr; #endif
Lparam. 32/64. Parâmetro para enviar mensagens. Anunciado em winnt.h como: typedef long_ptr lparam;
Tamanho_t. 32/64. Analógico do tipo tamanho_t. Anunciado em basetsd.h como: typedef ulong_ptr size_t;
Ssize_t. 32/64. Analógico do tipo ptrdiff_t. Anunciado em basetsd.h como: typedef long_ptr ssize_t;
Ulong_ptr. 32/64. O tipo não resolvido em que o ponteiro pode ser colocado. Anunciado em basetsd.h como: # SEF definido (_win64) typedef não assinado __int64 ulong_ptr; #eLse typedef não assinado longo ulong_ptr; #endif
Palavra. 16/16. Tipo instantâneo de 16 bits. Anunciado em windef.h como: palavra curta não assinada;
WParam. 32/64. Parâmetro para enviar mensagens. Anunciado em windef.h como: typedef uint_ptr wparam;
Tabela N3. Tipos de interesse ao transferir programas de 32 bits para sistemas Windows de 64 bits.

6. Diagnóstico de erros ocultos

Se você acha que após a correção de todos os erros de compilação, o aplicativo de 64 bits aguardados será recebido, então você terá que desapontá-lo. A coisa mais difícil na frente. No estágio de compilação, você será corrigido pelos erros mais óbvios que poderiam detectar o compilador, que estão principalmente relacionados à impossibilidade de esclarecimento implícito de tipos. Mas este é o topo do iceberg. A parte principal dos erros é escondida. Esses erros do ponto de vista do idioma abstrato S ++ parecem com segurança ou disfarçados de tipos explícitos de tipos. Existem várias vezes mais erros do que o número de erros identificados no estágio de compilação.

Na chave

/ Wp64.

A esperança não deve ser imposta. Esta chave é frequentemente apresentada como uma ferramenta maravilhosa para procurar erros de 64 bits. Na verdade, a chave / wp64 só possibilita ao compilar um código de 32 bits para obter alguns avisos que no modo de 64 bits, certas seções do código estarão incorretas. Ao compilar um código de 64 bits, esses avisos serão emitidos para o compilador de qualquer maneira. E quando a compilação de um aplicativo de 64 bits, a tecla / WP64 é ignorada. E ainda mais, essa chave não ajudará a encontrar erros ocultos [

onze

].

Considere vários exemplos de erros ocultos.

6.1. Esclarecimento explícito de tipos

O mais fácil, mas não é mais fácil de detectar a classe de erro associada a

Apresentação explícita de tipos

onde há circuncisão de significado bits.

Um exemplo comum - trazendo ponteiros para tipos de 32 bits ao transmiti-los para funcionar, como o SendMessage:

Myobj * pobj = ... :: sendmessage (hwnd, msg, (palavra) x, (dword) pobj); 

Aqui, o tipo explícito de tipo é usado para transformar o ponteiro no tipo numérico. Para uma arquitetura de 32 bits, o exemplo acima está correto, já que o último parâmetro da função SendMessage tem um tipo LParam, que em uma arquitetura de 32 bits coincide com DWORD. Para uma arquitetura de 64 bits, o DWORD usa erroneamente e deve ser substituído por LParam. Tipo LParam, dependendo da arquitetura, tamanho 32 ou 64 bits.

Este é um caso simples, mas muitas vezes o tipo de tipo parece mais refinado e detectá-lo usando os advertências do compilador ou a busca do programa de texto é impossível. Exemplos explícitos de tipos suprimem o diagnóstico do compilador, pois são precisamente destinados a dizer o compilador que o tipo de tipos está correto e o programador assumiu a responsabilidade pela segurança do código. A pesquisa explícita também não ajudará. Os tipos podem não ser nomes padrão (especificados pelo programador através do TypeDef), e os métodos de implementação de tipos explícitos de tipos também não são pequenos. Para diagnósticos confiáveis ​​de tais erros, é necessário usar apenas um kit de ferramentas especial, como analisadores

Viva64.

ou

PC-Lint.

.

6.2. Esclarecimento implícito de tipos

O exemplo a seguir está conectado já com

Tipo de levantamento implícito

onde há também uma perda de bits de significado. O código de função do FREAD lê-se no arquivo, mas incorreto quando você tenta ler mais de 2 gigabytes de dados em um sistema de 64 bits.

size_t __fread (void * __Restrict buff, tamanho_t tamanho, tamanho_t Contagem, arquivo * __Restrict fp); size_tfread (void * __resttttt buff, tamanho_t tamanho, tamanho_t, arquivo * __Restrict fp) {int ret; Flockfile (FP); ret = __IrRead (BUF, tamanho, contagem, fp); FunlockFile (FP); Retorno (ret);} 

A função __fread retorna o tipo de tamanho_t, mas o tipo int é usado para armazenar o número de bytes. Como resultado, com grandes volumes de dados legíveis, a função pode retornar o número de bytes, que realmente lerá.

Você pode dizer que este é um código analfabeto de iniciantes, que tal tipo de tipo relatará o compilador e que, em geral, esse código é fácil de encontrar e corrigir. Isso é teoricamente. E na vida quase real com grandes projetos, tudo pode ser colocado de outra forma. Este exemplo é retirado do código original do FreeBSD. O erro foi correto apenas em dezembro de 2008! Isto é apesar do fato de que a primeira versão (experimental) de 64 bits do FreeBSD saiu em junho de 2003.

Aqui está o código-fonte antes da correção:

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fead.c?rev=1.14.

Mas a versão revisada (dezembro de 2008) do ano:

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdio/fead.c?rev=1.15.

6.3. Trabalhar com bits, turnos

É fácil cometer um erro no código trabalhando com bits separados. O seguinte tipo de erro está associado às operações de deslocamento. Considere um exemplo:

ptrdiff_t setbitn (valor ptrdiff_t, bitnum não assinado) {ptrdiff_t mask = 1 << Bitnum; Valor de retorno | Mascarar;} 

O código fornecido está operacional em uma arquitetura de 32 bits e permite exibir bits com números de 0 a 31 por unidade. Depois de transferir o programa para a plataforma de 64 bits, será necessário definir bits de 0 a 63. Mas este código nunca definirá bits com 32-63 números. Observe que "1" tem um tipo int e ao mudar em 32 posições, um estouro ocorrerá, conforme mostrado na Figura 5. Obteremos como resultado de 0 (Figura 5-B) ou 1 (Figura 5-C) depende do compilador de implementação.

Figura 5. A - Instalação correta do 31 bits em código de 32 bits; B, C é um erro de instalar um 32 bit em um sistema de 64 bits (dois comportamentos)

Para corrigir o código, é necessário fazer uma constante "1" do mesmo tipo que a máscara variável:

ptrdiff_t mask = ptrdiff_t (1) << Bitnum; 

Nota também que o código defeituoso levará a um erro interessante. Ao definir 31 bits em um sistema de 64 bits, o resultado da função será 0xfffffff80000000 (veja a Figura 6). O resultado da expressão 1 << 31 é um número negativo -2147483648. Este número é representado em uma variável inteira de 64 bits como 0xfffffff80000000.

Figura 6. Erro de instalação do 31 bits no sistema de 64 bits

6.4. Números mágicos

Muitos problemas podem entregar constantes mágicas, ou seja, os números com os quais o tamanho de um ou outro tipo é definido. A solução correta é usar para tais objetos de sizeof () operadores (), mas uma parte antiga de código pode ser perdida em um grande programa, onde o ponteiro estava firmemente confiante de que o tamanho do ponteiro era de 4 bytes, e no Tipo Size_T Há sempre 32 bits. Normalmente, esses erros se parecem com isso:

size_t arraysize = n * 4; size_t * array = (size_t *) malloc (arrayize); 

Os principais números aos quais devem ser tomados com cautela ao alternar para uma plataforma de 64 bits são mostradas na Tabela N4.

Tabela N4. Valores mágicos básicos perigosos ao transferir aplicativos com 32 bits a uma plataforma de 64 bits

6.5. Erros de uso de variáveis ​​de 32 bits como índices

Nos programas de processamento de grandes quantidades de dados, os erros associados à indexação de grandes matrizes podem ocorrer ou ciclos de emergência. O exemplo a seguir contém 2 erros ao mesmo tempo:

const size_t size = ...; char * array = ...; char * end = array + tamanho; para (não assinado i = 0; i! = tamanho; tamanho; ++ i) {constt int sirt = 1; Final [-i - um] = 0;} 

O primeiro erro é que, se o tamanho dos dados que estão sendo processados ​​excederem 4 gigabytes (0xFFFFFFFF), o ciclo perpétuo pode ocorrer, já que a variável 'i' tem o tipo 'não assinado' e nunca atingirá o valor 0xfffffff. Eu especificamente escrevo que o surgimento é possível, mas não necessariamente acontecerá. Depende de qual código irá construir um compilador. Por exemplo, no modo de depuração (depuração), o ciclo eterno estará presente e, no código de liberação, o loop desaparecerá, então o compilador decidirá otimizar o código usando um registro de 64 bits e o ciclo será correto. Tudo isso adiciona confusão e o código que funcionou ontem, pode parar inesperadamente para trabalhar no dia seguinte.

O segundo erro está associado à passagem da matriz do final até o início dos quais os valores de índice negativos são usados. O código fornecido é operacional no modo de 32 bits, mas quando é iniciado em uma máquina de 64 bits, na primeira iteração do ciclo, ele será acessado pelas bordas da matriz e o programa é acidentalmente concluído. Considere a causa desse comportamento.

De acordo com a regra SI ++ no sistema de 32 bits, a expressão "-i - uma" será calculada da seguinte forma (na primeira etapa I = 0):

  1. A expressão "-i" tem o tipo não assinado e tem um valor de 0x00000000U.
  2. A variável 'uma' será expandida do tipo 'int' para o tipo não assinado e será igual a 0x00000001u. Nota: O tipo int se expande (de acordo com o padrão de idioma Si ++) para o "não assinado", se estiver envolvido na operação, onde o segundo argumento tem o tipo não assinado.
  3. Alimente a operação da subtração, na qual dois valores de tipo não assinados e o resultado da operação é 0x00000000U - 0x000001U = 0xfffffffu. Por favor, note que o resultado tem um tipo não salvo.
  4. No sistema de 32 bits, acessando a matriz do índice 0xFFFFFFU é equivalente a usar o índice -1. Isto é, final [0xfffffffu] é uma extremidade analógica [-1]. Como resultado, o processamento correto do elemento da matriz ocorre.

No sistema de 64 bits no último parágrafo, a imagem será diferente. Uma extensão do tipo não assinada ao icônico ptrdiff_t e o índice de matriz será igual a 0x0000004FFFFFFFFFI64. Como resultado, haverá uma saída da matriz.

Para corrigir o código, você precisa usar esses tipos como ptrdiff_t e size_t.

6.6. Erros relacionados aos tipos de alteração de recursos usados

Há erros em que, em geral, ninguém é culpado, mas eles não deixam de se errar. Imagine que há muito tempo em uma galáxia distante (no Visual Studio 6.0), foi desenvolvido um projeto em que há uma classe csamplepp, que é o herdeiro da CwinApp. A classe base tem uma função virtual do WINHELP. O herdeiro se sobrepõe a esse recurso e realiza as ações necessárias. Visualmente, isso é apresentado na Figura 7.

Figura 7. Código correto viável que é criado no Visual Studio 6.0

O projeto é então transferido para o Visual Studio 2005, onde o protótipo da função WINHELP foi alterado, mas isso não percebe, já que no modo de 32 bits, os tipos de DWORD e DWORD_PTR coincidem e o programa continua a funcionar corretamente (Figura 8 ).

Figura 8. Não é correto, mas código operacional de 32 bits

O erro está esperando para se expressar em um sistema de 64 bits, onde o tamanho dos tipos DWORD e DWORD_PTR é diferente (Figura 9). Acontece que em um modo de 64 bits, as classes contêm duas funções diferentes do WinHelp, que é naturalmente incorreta. Observe que essas armadilhas podem ser ocultas não apenas no MFC, onde parte das funções alteraram os tipos de seus argumentos, mas também no código de suas aplicações e bibliotecas de terceiros.

Figura 9. O erro se manifesta em um código de 64 bits

6,7. Diagnóstico de erros ocultos

Exemplos de erros semelhantes de 64 bits também podem ser dados. Aqueles que estão interessados ​​em tais erros e querem mais propensos a aprender sobre eles estarão interessados ​​no artigo "20 C ++ - Armadilhas de código - Código para uma plataforma de 64 bits" [

12.

].

Como você pode ver, o estágio de encontrar erros ocultos é uma tarefa não trivial, especialmente porque muitas delas se manifestarão irregularmente ou apenas em grandes quantidades de dados de dados. Os analisadores de código estático são adequados para diagnosticar esses erros, pois podem verificar todo o código do aplicativo, mas não dependendo dos dados de entrada e da frequência de suas seções em condições reais. Use a análise estática faz sentido tanto no estágio de transferência de aplicativos para plataformas de 64 bits para encontrar a maioria dos erros no estágio inicial, e no desenvolvimento adicional de soluções de 64 bits. A análise estática irá avisar e ensinar um programador para entender melhor os recursos de erros associados à arquitetura de 64 bits e gravar código mais eficiente. O autor do artigo é um desenvolvedor de um desses analisadores de código especializados, que é chamado VIVA64 [

Treze

]. É possível se familiarizar com a ferramenta em mais detalhes e baixar a versão de demonstração do site dos sistemas de sistemas de verificação do sistema.

Como justiça, deve ser dito que, em tais analisadores de código como

Gimpel pc-leint

и

Teste de Parasoft C ++

Existem conjuntos de regras para diagnosticar erros de 64 bits. Mas, primeiro, estes são analisadores de uso geral e as regras para diagnosticar erros de 64 bits neles são mal representadas. Em segundo lugar, eles são mais orientados para o modelo de dados.

Lp64.

Usado na família do sistema operacional Linux, que reduz o seu favor para programas do Windows em que o modelo de dados é usado.

Llp64.

[

14.

].

7. Passo sétimo. Modernização do processo de teste

Descrito na seção anterior da busca por erros no código do programa necessário, mas insuficiente etapa. Nenhum método, incluindo análise de código estático, não fornece uma garantia completa de detecção de todos os erros e o melhor resultado pode ser alcançado apenas durante uma combinação de várias técnicas.

Se o seu programa de 64 bits processar uma quantidade maior de dados do que uma versão de 32 bits, é necessário expandir os testes para ativar o processamento de dados em mais de 4 gigabytes. Esta borda atrás das quais muitos erros de 64 bits começam a se manifestar. Tempo que esses testes podem ser uma ordem de grandeza mais e é necessário estar pronto para estar pronto. Geralmente, os testes escrevem para processar um pequeno número de itens em cada teste e, assim, poder passar todas as unidades internas, por exemplo? Em poucos minutos, e testes automáticos (por exemplo, usando

Automatedqa testomplete.

) Por algumas horas. Função de classificação em um sistema de 32 bits se classificar 100 itens, quase com uma garantia completa será realizada corretamente por 100.000 itens. Mas a mesma função no sistema de 64 bits pode decolar ao tentar processar 5 bilhões de elementos. A velocidade do teste da unidade pode ser reduzida a milhões de vezes. Não se esqueça de estabelecer o custo de adaptação de testes ao explorar sistemas de 64 bits. Uma solução é a separação de testes unitários para rápido (trabalhando com uma pequena quantidade de memória) e lento, processando gigabytes e lançado, por exemplo, à noite. O teste automatizado de programas de 64 bits intensivos de recursos pode ser construído com base na computação distribuída.

Leave a Reply