【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

posted @ 2021-07-07 15:01  Sky&Zhang  阅读(1147)  评论(0编辑  收藏  举报