我知道解引用空指針是未定義的 - 但我想知道在特定目標上發生了什麼 - MSP430。在MSP430上,當我解引用空指針時會發生什麼?
我沒有在我面前加載這個板子來測試這個。
如果我這樣做(或類似)會發生什麼?
int * foo = NULL;
(*foo)++; //Crash?
位置0x0位於SFR範圍內並被保留。
它會生成PUC/POR嗎?或者它會默默「工作」?
產生的組件是
;int * foo = NULL;
clr.w R15
;(*foo)++;
inc.w R15
所以0x0位置字面上被1
遞增當我在我模擬器看到在地址0x0的值去從0到1運行此調試日誌中沒有警告,程序正常退出。
我正在使用IAR EW430編譯器/彙編器/模擬器。
就這麼清楚,你要求觀察未定義行爲的行爲;一個很高的命令。如果你的mits中有實際的*硬件*,這個問題不會在這裏,對嗎?即便如此,是不是會依賴於在違規時是否安裝了重寫中斷鉤子,這將取決於所述相同的具體時刻? (或者你有*完全控制以上所有內容?)。 – WhozCraig
@WhozCraig,這是正確的。在一個堅果殼裏,我問是否當0x0被讀取或寫入時,msp430是否會猛烈關閉,或者它是否有害地繼續工作。我似乎無法弄清楚這個地址會包含什麼。有一個可以設置的中斷,當訪問正常範圍之外的「空閒」內存時,它會觸發,從中可以記錄事件的一些日誌,但我不認爲這是一個選項。或多或少,我正在詢問一個不使用斷言或以其他方式檢查接口中的指針參數的大型不規則遺留代碼庫。 – Nick
地址0,1是中斷使能位。因此,將地址0從值0遞增到值1將啓用其中一箇中斷。該計劃將保持正確運行。 @Nick,你有沒有讀過msp430的架構表?該體系結構規範可以在以下網址找到: –
user3629249