1. 程式人生 > 其它 >【Sparse】關於__attribute__((bitwise)),__le32,__be32等的理解【轉】

【Sparse】關於__attribute__((bitwise)),__le32,__be32等的理解【轉】

轉自:https://blog.csdn.net/feflkdfgj/article/details/75671453

Sparse 誕生於 2004 年, 是由linux之父Linus開發的, 目的就是提供一個靜態檢查程式碼的工具, 從而減少linux核心的隱患。核心程式碼中有一個簡略的關於 Sparse的說明檔案: Documentation/sparse.txt。這裡我們主要關注__attribute__((bitwise))的作用。通過閱讀資料以及實驗,關於bitwise有獲得如下認知:

Sparse是一個獨立於gcc的工具,雖然__attribute__((bitwise))看起來是gcc的屬性宣告格式,實際上gcc並不會處理這個屬性。
Sparse的原始碼可以從: git://git.kernel.org/pub/scm/linux/kernel/git/josh/sparse.git獲取,或者 http://www.codemonkey.org.uk/projects/git-snapshots/sparse/獲取
在程式碼裡經常會看到用__le16, __le32, __be16, __be32修飾某些變數,其實這些都是巨集定義,最終會使用__attribute__((bitwise))。le與be分別表示little endian和big endian。
"bitwise"(恰如其名)是用來確保不同位方式型別不會被弄混(小尾模式,大尾模式,cpu尾模式,或者其他)它提供了非常強的型別檢查,如果不同型別之間進行賦值,即便強制型別轉換,Sparse仍然會發出抱怨。
在網路程式設計裡面面,對位元組序的要求非常高,bitwise可以很好的幫助檢查潛在的錯誤。
bitwise的典型用法是利用typedef定義一個有bitwise屬性的基型別,之後凡是利用該基型別宣告的變數都將被強制型別檢查。
Sparse的典型用法是:sparse xxx.c
下面展示一個實際的例子,來演示使用方法:
程式碼如下:

Sparse編譯如下:


其中說明如下:
sparse是自己編譯的,下載原始碼後,make,make install即可。
基型別定義為__le32。
凡是與基型別不符合的賦值都會收到warning。
"force"可以用來關閉抱怨,前提是你知道自己在做什麼。
————————————————
版權宣告:本文為CSDN博主「ldmmdl11」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/feflkdfgj/article/details/75671453

【作者】張昺華 【出處】
http://www.cnblogs.com/sky-heaven/
【部落格園】 http://www.cnblogs.com/sky-heaven/ 【知乎】 http://www.zhihu.com/people/zhang-bing-hua 【我的作品---旋轉倒立擺】 http://v.youku.com/v_show/id_XODM5NDAzNjQw.html?spm=a2hzp.8253869.0.0&from=y1.7-2 【我的作品---自平衡自動循跡車】 http://v.youku.com/v_show/id_XODM5MzYyNTIw.html?spm=a2hzp.8253869.0.0&from=y1.7-2
【大餅教你學系列】https://edu.csdn.net/course/detail/10393 【新浪微博】 張昺華--sky 【twitter】 @sky2030_ 【微信公眾號】 張昺華 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.