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.
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
@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
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