2014-12-28 20 views
5

So che il dereferenziamento di un puntatore nullo non è definito, ma mi piacerebbe sapere cosa succede su un target specifico: un MSP430.In MSP430, cosa succede quando cancello un puntatore nullo?

Non ho una scheda per caricarla di fronte a me per testarlo subito.

Cosa accadrebbe se facessi questo (o qualcosa di simile)?

int * foo = NULL; 
(*foo)++; //Crash? 

Posizione 0x0 si trova nell'intervallo SFR ed è riservato.

Potrebbe generare un PUC/POR? O funzionerebbe silenziosamente?

L'assembly generato è

;int * foo = NULL; 
clr.w R15 
;(*foo)++; 
inc.w R15 

Quindi la posizione 0x0 viene letteralmente incrementato di 1.

Quando eseguo questo nel simulatore vedo il valore all'indirizzo 0x0 va da 0 a 1. I non ricevere avvisi nel registro di debug e il programma esce normalmente.

Utilizzo il compilatore/assemblatore/simulatore IAR EW430.

+0

Proprio così è chiaro, stai chiedendo comportamento osservato di comportamento indefinito; un alto ordine. Questa domanda non sarebbe qui se avessi l'effettivo * hardware * nei tuoi motori, giusto? E anche allora, non dipenderebbe dal fatto che al momento dell'infrazione sia stato installato un blocco di interrupt di emergenza, che dipenderebbe dal momento specifico di detto-stesso? (o hai * completo * il controllo su tutto quanto sopra?). – WhozCraig

+0

@WhozCraig è corretto. In un guscio di noce sto chiedendo se il msp430 si spegne violentemente quando viene letto o scritto 0x0 o continua a funzionare perniciosamente. Non riesco a capire cosa contenga comunque quell'indirizzo. C'è un interrupt che puoi attivare che si attiva quando si accede alla memoria "vuota" al di fuori dell'intervallo normale, dal quale puoi fare qualche registrazione sull'evento ma non penso che sia un'opzione qui. Più o meno mi sto chiedendo di una grande base di codice legacy indisciplinata che non usa assert o altrimenti controlla i parametri del puntatore nelle interfacce. – Nick

+0

l'indirizzo 0,1 sono i bit di abilitazione dell'interrupt. Pertanto l'incremento dell'indirizzo 0 dal valore 0 al valore 1 abiliterà uno degli interrupt. Il programma manterrà la giusta esecuzione. @Nick, non hai letto il foglio dell'architettura per msp430? Le specifiche dell'architettura sono disponibili all'indirizzo: user3629249

risposta

6

Non solo la scrittura e la lettura dell'indirizzo 0x0 non provocano un arresto anomalo o un riavvio, ma in realtà un'operazione completamente legale che viene spesso utilizzata dalle applicazioni MSP430.

La porzione iniziale o mappa di memoria MSP430 è riservato per porte I/O e I registri di controllo: http://en.wikipedia.org/wiki/TI_MSP430#MSP430_address_space

In particolare, i registri di controllo a 0x0 e indirizzi successivi sono:

#define IE1_     0x0000 /* Interrupt Enable 1 */ 
#define IE2_     0x0001 /* Interrupt Enable 2 */ 
#define IFG1_     0x0002 /* Interrupt Flag 1 */ 
#define IFG2_     0x0003 /* Interrupt Flag 2 */ 

Così, per esempio scrivendo zero a quell'indirizzo di memoria dereferenziando un puntatore uint8_t * o uint16_t * si disabiliteranno le interruzioni. Scrivendo zero dereferenziando uno uint32_t * si cancelleranno anche i flag. Incrementare il valore di questi registri non ha molto senso, ma dovrebbe essere completamente legale.

Almeno questo è il caso di msp430 Series 1, Series 2 e Series 4. Controllando i file di intestazione non sono riuscito a trovare nulla mappato a 0x0 su Serie 5 (i registri di controllo di interrupt sono mappati a regione a partire da 0x0100).

Quindi, se si desidera individuare punti nel codice in cui il puntatore NULL è dereferenziato, si è completamente soli.

+0

Grazie per la spiegazione, questo è quello di cui avevo paura. Stavo guardando un'intestazione della serie 5 ed è per questo che non sono riuscito a capire a cosa serve 0x0. – Nick