Was ist die Abhilfe für nicht ausgerichtete Speicherzugriffsausnahme auf ARM9 mit C?

StackOverflow https://stackoverflow.com/questions/673930

  •  21-08-2019
  •  | 
  •  

Frage

Architektur ARM9. Programmiersprache C.

Wir haben einen Drittstapel und einer der Anrufe nimmt einen Zeiger (pBuffer) auf einen Speicherplatz. Innerhalb des Stapels, sind sie frei, um den Zeiger übergeben bewegen und darauf zugreifen, wie sie wollen. Leider haben sie versetzt die in Zeiger übergeben und übergeben sie in eine andere Funktion, die diese von einem ungerade / unalighed Speicherplatz

zu tun versucht,
         ((uint16 *)pBuffer)[index] = value;

Dabei gilt value vom Typ uint16 und index ist Grenzen geprüft und Indizes pBuffer. Dies führt zu einer nicht ausgerichteten Speicherzugriff Ausnahme. pBuffer Punkte auf dem Heap char *.

Wie bereits erwähnt, auch wenn wir in den Dritt Stapel spähen können, können wir den Code offiziell nicht aktualisieren. So teilen wir die Provider und sie bieten das Update in der nächsten Version.

Ich möchte verstehen, wenn es eine Arbeit um für diese ist. Wie führe ich die obige Zuordnung ohne den nicht ausgerichteten Zugriff zu verletzen? Was ist der beste Ansatz, solche Probleme zu lösen.

War es hilfreich?

Lösung

für Byte den Wert Byte kopieren. Wirf ihn zu einem (unsigned) char-Zeiger, und dann einen Byte zu einem Zeitpunkt kopieren.

Es ist nicht schön, aber es klingt nicht wie haben Sie viele Möglichkeiten.

Andere Tipps

Es gibt drei Möglichkeiten, und ich kann aus Ihrer Frage nicht bestimmen, so weit was der Fall ist.

Fall 1: Der Index ist immer ungerade. Lösung: memmove () pBuffer über 1 Byte Fall 2: Der Index ist manchmal seltsam, und Sie können Frontvorhersagen, wenn es sein wird. Lösung: memmove () pBuffer über 1 Byte, wenn Sie wissen Index ungerade sein wird. Fall 3: Der Index ist manchmal seltsam, und man kann nicht vorhersagen, wann es sein wird. Dies ist bedauerlich, da der Code wird Fehler.

Wenn Sie die Kontrolle über pBuffer sind, als eine Arbeit um, könnte man es als ein Array von uint32_t erklären (oder was auch immer passt die Ausrichtung Ihrer Architektur). Mit den Puffer als uint32_t erklärt, wird der Compiler die richtige Ausrichtung wählen. Sie können ihn werfen * uint8_t wenn Ihre Ziel Funktion aufrufen.

Dies sollte mit dem Beispiel-Code arbeiten Sie auf dem Laufenden, aber immer noch fehlschlagen, wenn der Dritte Code mit unaligned in den Puffer-Offset gilt.

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