【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