Question

Je travaille actuellement sur la conversion d'une application 32 bits en une application 64 bits en C. Cette application fonctionne actuellement sur une architecture x86 (Windows, osx, Unix, Linux). Avant de commencer à coder, je voulais donc savoir ce que je devais prendre en compte lors de la conversion de l’application.

Était-ce utile?

La solution

  1. Trouvez qui l'a écrit. Sont-ils un idiot? Sont-ils vous d’il ya quelques années? Pouvez-vous leur poser des questions? Connaissent-ils l'existence de plusieurs plates-formes et systèmes? Connaître l’esprit des auteurs du programme vous aidera à comprendre les problèmes qui se posent lorsque vous les rencontrez.
  2. Obtenez un environnement machine / build 64 bits opérationnel.
  3. Remplacez long par int. Soyez parfaitement conscient que LONG n'est pas long.
  4. Remplacez (int)&x les conversions et la saisie par intptr_t et (unsigned int)&x par uintptr_t
  5. Auditez tout ce qui repose sur la conversion des structures char* pour en faire un calcul arithmétique.
  6. Recherche de regex pour \ < 4 \ > au cas où vous auriez supposé 4 = sizeof(void*)
  7. Soyez patient. Lorsque vous trouvez un problème, cherchez ailleurs si le même problème existe, et enveloppez la solution dans une macro.
  8. Essayez de ne pas utiliser #ifdef RUN64 ou quelque chose de similaire. Vous le regretterez si les plateformes 128 bits sont à la mode.
  9. Encapsulez toutes vos modifications sous forme de macros centralisées masquant les différences de portabilité ailleurs dans votre programme.
  10. Utilisez un testeur de couverture pour vous assurer que vous avez tout couvert (le cas échéant)

ÉDITER a ajouté la <=> note suggérée par un commentaire.

Autres conseils

Un problème potentiel non déjà mentionné est que si votre application lit ou écrit des données binaires à partir du disque (par exemple, lisez un tableau de structures avec fread), vous devrez vérifier très attentivement et éventuellement finir par en avoir deux. lecteurs: un pour les fichiers hérités et un pour les fichiers 64 bits. Ou, si vous veillez à utiliser des types tels que uint32_t et ainsi de suite du fichier d'en-tête <stdint.h>, vous pouvez redéfinir vos structures pour qu'elles soient compatibles bit-à-bit. Dans tous les cas, la E / S binaire est à surveiller.

Cela dépend vraiment de l'application et de la manière dont elle a été codée. Certains codes peuvent simplement être recompilés avec un compilateur 64 bits et cela fonctionnera, mais cela ne se produit généralement que si le code a été conçu dans un souci de portabilité.

Si le code comporte de nombreuses hypothèses sur la taille des types et des pointeurs natifs, s'il contient beaucoup de bits de compression de bits ou s'il s'adresse à un processus externe en utilisant un protocole d'octet spécifié, mais en utilisant certaines hypothèses sur la taille de types natifs, il peut alors s’avérer nécessaire, voire beaucoup, de travailler pour obtenir une compilation propre.

Presque tous les avertissements du casting et du compilateur sont un drapeau rouge à vérifier. Si le code n'était pas &, Avertissement de nettoyage & Quot; pour commencer, c’est aussi un signe qu’il faudra peut-être beaucoup de travail.

Si vous avez utilisé les types corrects pour vos valeurs, par exemple. size_t, ptrdiff_t, uintptr_t, les types int de taille fixe de stdint.h le cas échéant - et ne codant pas en dur les tailles de valeur, votre code doit fonctionner immédiatement.

Le problème principal que vous rencontrez lors du passage à 64 bits est que la taille des pointeurs est différente (64 bits au lieu de 32 - duh). La taille des entiers et la taille des longs peuvent également différer, en fonction de la plate-forme.

Pourquoi est-ce un problème? Eh bien, ce n’est pas le cas, sauf si votre code suppose que sizeof (int) == sizeof (void *). Cela pourrait entraîner de vilains bugs de pointeur.

Eh bien, fondamentalement, le nombre de modifications est assez réduit, mais la tâche sera encore importante si l'application n'est pas soigneusement écrite pour être assez portable, pour commencer.

La principale différence est que les pointeurs ont une largeur de 64 bits, mais la plupart des autres types de données sont inchangés. Un int est toujours 32 bits, et un long est probablement aussi toujours 32 bits. Donc, si votre code bascule entre les ints et les pointeurs, cela va casser. De même, toute structure ou similaire qui dépend d’un offset spécifique par rapport à un membre peut tomber, car d’autres membres peuvent maintenant être plus grands et donc modifier l’offset.

Bien sûr, votre code ne doit jamais compter sur ces astuces, donc dans un monde idéal, cela ne poserait aucun problème, vous pourriez simplement recompiler et tout fonctionnerait. Mais vous ne vivez probablement pas dans un monde idéal ...;)

Les deux différences principales entre la programmation C en 32 bits et en 64 bits sont sizeof (void *) et sizeof (long). Le problème majeur que vous aurez est que la plupart des systèmes Unix utilisent la norme I32LP64 qui définit une longueur de 64 bits et que Win64 utilise la norme IL32LLP64 qui définit une longueur de 32 bits. Si vous devez prendre en charge la compilation multiplate-forme, vous pouvez utiliser un ensemble de normes de typage basées sur l'architecture pour les entiers 32 bits et 64 bits, afin de vous assurer que tout le code se comportera de manière cohérente. Ceci est fourni dans stdint.h dans le cadre de la norme C99. Si vous n’utilisez pas de compilateur C99, vous devrez peut-être lancer votre propre équivalent

Comme indiqué ailleurs, les principales préoccupations en matière de conversion seront le code qui suppose sizeof (int) == sizeof (long) == sizeof (void *), un code prenant en charge les données écrites sur disque et un code pour IPC multiplate-forme. .

Pour une bonne synthèse de l'historique, consultez cet article depuis la file d’attente ACM.

Il y a déjà beaucoup de bonnes réponses.

Envisagez d'utiliser Gimpel Lint . Il peut indiquer exactement les types de constructions problématiques. Si votre expérience est comparable à la mienne, elle vous signalera également de nombreux bogues non liés au port 32/64 bits dans le système.

Tout sur le 64 bits pour les développeurs:

Articles sur le développement 64 bits

Collection de liens Ressources 64 bits

Outil Viva64

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top