小華的部落格: 2011/6/26 - 2011/7/3

bloggerads_Head

搜尋此網誌

星期四, 6月 30, 2011

EFI需要注意的一些C語言小細節

底下是節錄一些我們Team自己內部分享的一些心得,讓大家知道其實C語言有許許多多的小地方是需要大家注意的!

1.指標最大的問題是Compiler不會做邊界檢查

    ex: a[10];
          p=&a[0];
          *(p+13];  <--這種操作Compiler並不會跟你說有問題


2. Free(p) ;同一個指標只能free 一次,當free(p) 兩次就會出事情
 ...


3.memcopy(dst,src,size)時記得size不能比目的大
 ex:
      src[100],dsc[50];
      memcopy(dsc,src,sizeof(src));  <--溢位
      memcopy(dsc,src,sizeof(dsc));  <--沒事

...


UEFI 開發過程中最大的問題~

大家都知道UEFI已經變成這個世代中的BIOS代名詞,但是這個環境下在開發BIOS的時候最怕遇到甚麼事情呢?

答案就是: C語言指標的邊界檢查

指標這個東西在C的環境中讓人又愛又怕。愛的地方是因為指標可以任意的轉型態、任意的操作你想存取的記憶體區塊,但是往往致命的吸引力中就會有他無可避免的壞處!

例如,你可以宣告一個陣列 a[10]; 然後拿一個指標 p指向這個陣列
但是當你的code寫成 *(p+13) 時,就會是個大麻煩!

因為Compiler 並不會告訴你說,嘿! 兄弟你的指標超出存取範圍了! 然後當CODE執行到那邊的時候就出現當機或是難以解釋的事件發生! 往往悲劇就是出現在不注意的小地方~

所以BIOS工程師在撰寫CODE的時候就必須對於指標操作很清楚,不然在UEFI BIOS環境下一定會出現許許多多靈異事件的~ (以前Legacy BIOS最被忽略的是堆疊PUSH/POP沒對齊,現在變成指標 >.<)

不過可喜可賀的是我們家的BIOS工程師對於這一點都很講究啦~

Bluescreen 錯誤碼查詢

底下這個網站的資訊可以幫助你在發生BSOD的時候可以依照Error code來查詢微軟有沒有相關的說明,或是更新檔!

所以大家可以很方便的透過底下這個網站的資訊來解決問題,可以幫助你減少一些搜尋資料的時間:

http://www.bruchmann-web.de/zh-cn/support/windows/bluescreen/0x0000007b/kb-page/2/kb-sort/ms-description--asc/