2014-12-28 62 views
5

我知道解引用空指針是未定義的 - 但我想知道在特定目標上發生了什麼 - 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編譯器/彙編器/模擬器。

+0

就這麼清楚,你要求觀察未定義行爲的行爲;一個很高的命令。如果你的mits中有實際的*硬件*,這個問題不會在這裏,對嗎?即便如此,是不是會依賴於在違規時是否安裝了重寫中斷鉤子,這將取決於所述相同的具體時刻? (或者你有*完全控制以上所有內容?)。 – WhozCraig

+0

@WhozCraig,這是正確的。在一個堅果殼裏,我問是否當0x0被讀取或寫入時,msp430是否會猛烈關閉,或者它是否有害地繼續工作。我似乎無法弄清楚這個地址會包含什麼。有一個可以設置的中斷,當訪問正常範圍之外的「空閒」內存時,它會觸發,從中可以記錄事件的一些日誌,但我不認爲這是一個選項。或多或少,我正在詢問一個不使用斷言或以其他方式檢查接口中的指針參數的大型不規則遺留代碼庫。 – Nick

+0

地址0,1是中斷使能位。因此,將地址0從值0遞增到值1將啓用其中一箇中斷。該計劃將保持正確運行。 @Nick,你有沒有讀過msp430的架構表?該體系結構規範可以在以下網址找到: user3629249

回答

6

不僅寫入和讀取地址0x0不會導致崩潰或重新啓動,它實際上是MSP430應用程序經常使用的完全合法的操作。

將最初部分或MSP430存儲器映射被保留用於I/O端口和控制寄存器:http://en.wikipedia.org/wiki/TI_MSP430#MSP430_address_space

特別地,在爲0x0的控制寄存器和隨後的地址是:

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

所以,例如通過引用uint8_t *uint16_t *指針將禁用中斷來將零寫入該內存地址。通過解引用uint32_t *來寫0,它也將清除標誌。增加這些寄存器的價值沒有多大意義,但應該是完全合法的。

至少在msp430系列1,系列2和系列4上就是這種情況。通過檢查頭文件,我無法在系列5上找到映射到0x0的任何內容(中斷控制寄存器映射到從0100)。

所以,如果你想要在空指針被解除引用的代碼中捕捉到地方,你完全是你自己的。

+0

感謝您的解釋,這就是我所害怕的。我正在查看5系列頭文件,這就是爲什麼我無法弄清楚0x0的用途。 – Nick

相關問題