Frage

ich derzeit arbeite eine 32-Bit-Anwendung in eine 64-Bit-Anwendung in C auf die Umwandlung dieser Anwendung derzeit auf x86-Architektur arbeitet (Windows, OS X, Unix, Linux). Also, bevor Codierung starten, ich wollte wissen, was zu tun, muss ich prüfen, während die Anwendung umzusetzen.

War es hilfreich?

Lösung

  1. Finden Sie heraus, wer es geschrieben hat. Sind sie ein Idiot? Sind sie Sie von vor ein paar Jahren? Können Sie sie Fragen stellen? Sind sie vertraut mit der Existenz von mehreren Plattformen und Systemen? Zu wissen, der Geist-Satz des Autors (en) des Programms wird Ihnen helfen, Probleme zu verstehen, wenn man in ihnen laufen.
  2. Hier finden Sie eine 64-Bit-Maschine / Build-Umgebung und läuft.
  3. Ersetzen lange mit int. Seien Sie weiß wohl, dass LONG nicht long.
  4. Ersetzen (int)&x Abgüsse und Typisierung mit intptr_t und (unsigned int)&x mit uintptr_t
  5. Audit alles, was auf Gussstrukturen beruht auf char* damit Pointer-Arithmetik zu tun.
  6. Regex Suche nach \ <4 \>, falls Sie angenommen 4 = sizeof(void*)
  7. Seien Sie geduldig. Wenn Sie ein Problem finden, woanders suchen, wenn das gleiche Problem besteht, und die Lösung in einem Makro wickeln.
  8. Versuchen Sie nicht #ifdef RUN64 oder ähnliches zu verwenden. Sie werden es bereuen, wenn die 128-Bit-Plattformen immer in Mode gehen.
  9. alle Änderungen in Bezug auf einige zentrale Makros kapseln, die die Portabilität Unterschiede an anderer Stelle in Ihrem Programm verstecken werden.
  10. ein Coverage Tester verwenden, um sicherstellen, dass Sie alles abgedeckt haben (falls zutreffend)

EDIT hinzugefügt uintptr_t Note wie Kommentar vorgeschlagen.

Andere Tipps

Ein mögliches Problem erwähnte nicht bereits ist, dass, wenn Ihre Anwendung liest oder schreibt binäre Daten von der Festplatte (zB ein Array von Strukturen mit fread lesen), Sie gehen zu müssen, sehr sorgfältig prüfen und vielleicht zwei Leser aufzuwickeln mit: ein für Legacy-Dateien und ein für 64-Bit-Dateien. Oder, wenn Sie vorsichtig sind Typen wie uint32_t zu verwenden und so weiter aus der <stdint.h> Header-Datei, können Sie Ihre Strukturen neu zu definieren Bit-für-Bit-kompatibel zu sein. In jedem Fall binäre I / O ist eine Sache zu achten.

Das hängt wirklich von der Anwendung und wie sie codiert wurde. Einige Code kann nur mit einem 64-Bit-Compiler neu kompiliert werden, und es wird nur funktionieren, aber in der Regel geschieht dies nur, wenn der Code mit der Portabilität im Verstand entworfen worden.

Wenn der Code hat eine Menge von Annahmen über die Größe von nativen Typen und Zeigern, wenn es eine Menge Bitverpackungseinheit Hacks hat oder davon spricht mit einem externen Prozess eines Byte angegeben Protokoll aber mit einigen Annahmen über die Größe native Typen einig dann kann es erfordern, oder eine Menge, von der Arbeit eine saubere Übersetzung zu erhalten.

So ziemlich jede Besetzung und Compiler-Warnung ist eine rote Fahne, die aus muss überprüft. Wenn der Code nicht „Warnung sauber“ war dann zu beginnen, dass ist auch ein Zeichen dafür, dass eine Menge Arbeit erforderlich.

Wenn Sie die richtigen Typen für Ihre Werte verwendet - zB. size_t, ptrdiff_t, uintptr_t, die feste Größe int Typen von stdint.h gegebenenfalls -. und Wertgrößen nicht hart codieren, Ihr Code sollte aus der Box arbeitet

Das Hauptproblem Sie konfrontiert werden, wenn auf 64-Bit-Schalt ist, dass die Größe der Zeiger unterschiedlich sind (64 Bit anstelle von 32 - duh). Die Größe der ganzen Zahlen und die Größe von Long-Positionen könnte unterscheiden, auf der Plattform abhängig

Warum ist das ein Problem? Nun, es ist nicht, es sei denn, Ihr Code wird davon ausgegangen, dass sizeof (int) == sizeof (void *). Dies könnte zu einem fiesen Zeiger Bugs führen.

Nun, im Grunde ist die Anzahl der Änderungen ziemlich klein, aber es wird immer noch eine große Aufgabe sein, wenn die Anwendung sorgfältig ist nicht etwas tragbar geschrieben, um mit zu beginnen.

Der Hauptunterschied besteht darin, dass Zeiger 64 Bit breit sind, und die meisten anderen Datentypen sind unverändert. Ein int ist immer noch 32 Bit und eine lange ist wahrscheinlich auch noch 32-Bit. Also, wenn Ihr Code zwischen ints und Zeiger wirft, das geht zu brechen. jede Struktur oder ähnliche ähnlich, die an ein Mitglied Offset auf einem bestimmten hängt brechen kann, weil andere Mitglieder jetzt größer sein können, und so den Offset ändern.

Natürlich Ihr Code sollte nie in erster Linie auf diesen Tricks angewiesen ist, so in einer idealen Welt, das ist kein Problem sein würde, und man konnte einfach neu kompilieren und alles funktionieren würde. Aber Sie wahrscheinlich in einer idealen Welt leben nicht ...;)

Die beiden Hauptunterschiede zwischen 32-Bit- und 64-Bit-Programmierung in C sind sizeof (void *) und sizeof (long). Das Hauptproblem, das Sie haben, ist, dass die meisten Unix-Systemen die I32LP64 Standard verwenden, die eine lange 64 Bits definiert und Win64 verwendet den IL32LLP64 Standard, der eine lange 32 Bits definiert. Wenn Sie plattformübergreifende Zusammenstellung unterstützen müssen, können Sie eine Reihe von Architektur basiert typedefs für 32-Bit- und 64-Bit-Integer verwenden möchten, um sicherzustellen, dass der gesamte Code konsequent verhalten wird. Dies geschieht im Rahmen von stdint.h als Teil des C99-Standard zur Verfügung gestellt. Wenn Sie keinen C99-Compiler verwenden, müssen Sie Ihre eigene Äquivalent rollen

Wie an anderer Stelle die Hauptanliegen für die Umwandlung festgestellt werden Code, die sizeof (int) übernehmen == sizeof (long) == sizeof (void *), Codedaten zu unterstützen, die auf der Festplatte und Code für Cross-Plattform-IPC geschrieben wurden .

Für eine gute Übersicht über die Geschichte dahinter, werfen Sie einen Blick auf diese Artikel von ACM Queue.

Es gibt viele gute Antworten bereits.

Erwägen Sie Gimpel Lint . Es kann genau die Arten von Konstrukten weisen darauf hin, die problematisch sind. Wenn Ihre Erfahrung wie meine ist, wird es zeigen Ihnen auch viele Fehler im System nicht mit dem 32/64 Bit-Port.

Alles über 64-Bit für Entwickler:

Artikel über 64-Bit-Entwicklung

Links Sammlung 64-Bit-Ressourcen

Viva64

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top