Qual è la soluzione per un'eccezione di accesso alla memoria non allineata su ARM9 in C?

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

  •  21-08-2019
  •  | 
  •  

Domanda

Architettura ARM9. Linguaggio di programmazione C.

Abbiamo una pila di terze parti e una delle chiamate richiede un puntatore (pBuffer) per una locazione di memoria. All'interno della pila, sono liberi di muoversi intorno al puntatore passato e accedervi come vogliono. Purtroppo, hanno compensato il passato in puntatore e passato in un un'altra funzione che ha provato a fare questo da un dispari / unalighed posizione di memoria

         ((uint16 *)pBuffer)[index] = value;

dove value è di tipo uint16 e index è limiti controllati e indici char *. Ciò causa un'eccezione di accesso alla memoria non allineati. <=> punti per <=> sul mucchio.

Come già detto, anche se siamo in grado di sbirciare nella pila di terze parti, non possiamo aggiornare il codice ufficialmente. Così abbiamo avvisato il provider e che forniscono l'aggiornamento nella prossima release.

voglio capire se c'è un lavoro in giro per questo. Come si esegue l'assegnazione sopra senza violare l'accesso non allineati? Qual è l'approccio migliore per risolvere questi problemi.

È stato utile?

Soluzione

Copia il byte per byte valore. Cast a un (non firmato) puntatore char, e quindi copiare un byte alla volta.

Non è abbastanza, ma non suona come avete molte opzioni.

Altri suggerimenti

Ci sono tre possibilità, e non in grado di determinare dalla tua domanda finora che è il caso.

Caso 1: L'indice è sempre dispari. Soluzione: memmove () pBuffer più di 1 byte Caso 2: L'indice è a volte strano, ed è possibile prevedere in anticipo quando sarà. Soluzione: memmove () pBuffer oltre 1 byte quando si sa indice sarà strano. Caso 3: L'indice è a volte strano, e non è possibile prevedere quando sarà. Questo è un peccato, perché il codice di errore.

Se si è in controllo di pBuffer, come un lavoro in giro, si potrebbe dichiararla come una matrice di uint32_t (o qualsiasi altra cosa corrisponde l'allineamento della vostra architettura). Con dichiarando il buffer come uint32_t, il compilatore sceglierà il corretto allineamento. È possibile gettarlo ai uint8_t * quando si chiama la funzione di destinazione.

Questo dovrebbe funzionare con il codice di esempio che hai postato, ma potrebbe comunque non riuscire se il codice di terze parti si applica alcuna compensazione al buffer non allineato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top