| 原作者 | リーナス・トーバルズ |
|---|---|
| 開発者 | ジョシュ・トリプレット、クリストファー・リー、リュック・ヴァン・オーステンリック |
| 初回リリース | 2003 |
| 安定版リリース | 0.6.4 / 2021年9月6日[1] |
| リポジトリ |
|
| 書かれた | C |
| オペレーティング·システム | Linux、BSD、macOS、MinGW、Cygwin |
| タイプ | 静的コード分析 |
| ライセンス | MITライセンス |
| Webサイト | sparse.docs.kernel.org |
Sparseは、 Linuxカーネルの潜在的なコーディングエラーを見つけるために設計されたコンピュータソフトウェアツールです。[2]他の同様のツールとは異なり、この静的解析ツールは当初、ユーザーアドレス空間とカーネルアドレス空間へのポインタの混在など、カーネル開発者が関心を持つ可能性のある構造のみにフラグを立てるように設計されていました。
Sparse は既知の問題をチェックし、開発者がポインターが指すアドレス空間や関数が取得または解放するロックなどの データ型に関する情報を伝える注釈をコードに含めることを可能にします。
Linus Torvaldsは2003年にSparseを書き始めました。2006年からはJosh Triplettがメンテナーを務め、2009年にChristopher Li [3]が引き継ぎ 、2018年11月にLuc Van Oostenryck [4]が引き継ぎました。SparseはMITライセンス の下でリリースされています。
注釈
Sparseによって実行されるチェックの一部では、__attribute__ GCC拡張機能またはSparse固有の__context__指定子を使用してソースコードに注釈を付ける必要がある。[5] Sparseは次の属性のリストを定義している。
address_space(num)bitwiseforcecontext(expression,in_context,out_context)
API がマクロで定義されている場合、指定子はに置き換えることができます。
__attribute__((context(...)))__context__(...)
Linuxカーネルの定義
Linux カーネルは、linux/compiler.h および linux/types.h ファイルで、次の短縮形をプリプロセッサ マクロとして定義します (__CHECKER__フラグなしでビルドすると、これらの注釈はすべてコードから削除されます)。
#ifdef __CHECKER__
# __user を定義 __attribute__((noderef, address_space(1)))
# __kernel を定義 __attribute__((address_space(0)))
# __safe を定義 __attribute__((safe))
# __force を定義 __attribute__((force))
# __nocast を定義 __attribute__((nocast))
# __iomem を定義 __attribute__((noderef, address_space(2)))
# __must_hold(x) を定義 __attribute__((context(x,1,1)))
# __acquires(x) を定義 __attribute__((context(x,0,1)))
# __releases(x) を定義 __attribute__((context(x,1,0)))
# __acquire(x) を定義 __context__(x,1)
# 定義__release(x) __context__(x,-1)
# __cond_lock(x,c) を定義 ((c) ? ({ __acquire(x); 1; }) : 0)
# __percpu を定義 __attribute__((noderef, address_space(3)))
#ifdef CONFIG_SPARSE_RCU_POINTER
# __rcu を定義 __attribute__((noderef, address_space(4)))
#else
# __rcu を定義
#endif
extern void __chk_user_ptr ( const volatile void __user * ); extern void __chk_io_ptr ( const volatile void __iomem * ); #else # __user を定義# __kernel を定義# __safe を定義# __force を定義# __nocast を定義# __iomem を定義 # __chk_user_ptr(x) (void)0を定義 # __chk_io_ptr(x) (void)0を定義 # __builtin_warning(x, y...) (1)を定義 # __must_hold(x) を定義 # __acquires( x) を定義 # __releases(x) を定義# __acquire(x) (void)0 を定義# __release(x) (void)0 を定義 # __cond_lock(x,c) (c) を定義# __percpu を定義# __rcu を定義#endif
#ifdef __CHECKER__
# __bitwise __attribute__((bitwise)) を定義
#else
# __bitwise を定義
#endif
例
型__le32と は、異なるエンディアン__be32を持つ 32 ビット整数型を表します。ただし、C 言語では、これらの型の変数を混在させないように指定することはできません。属性は、これらの型を制限付きとしてマークするために使用されるため、これらの型の変数または他の整数変数が混在している場合、Sparse は警告を発します。
bitwise
typedef __u32 __bitwise __le32 ; typedef __u32 __bitwise __be32 ;
制限された型間の有効な変換をマークするには、属性を使用したキャストをforce使用して、Sparse が警告を発するのを回避します。
参照
参考文献
- ^ リュック・ヴァン・オーステンリック (2021-09-06). 「スパース0.6.4」。linux-sparse@vger.kernel.org (メーリングリスト) 。2024 年 5 月 8 日に取得。
- ^ Yoann Padioleau、René Rydhof Hansen、Julia L. Lawall、Gilles Muller (2006)。Linuxデバイス ドライバーの付随的な進化を文書化および自動化するためのセマンティック パッチ。プログラミング言語とオペレーティング システムに関する第 3 回ワークショップの議事録: 最新のオペレーティング システムに対する言語サポート。CiteSeerX 10.1.1.122.7080。doi : 10.1145 /1215995.1216005。ISBN 1-59593-577-0Linux コミュニティは最近、C コードをより良く分析するためにさまざまなツールを使い始めました。Sparse
は、コンパイラ フロントエンドのように、C プログラムの抽象構文ツリーと型情報への便利なアクセスを提供するライブラリです。
- ^ Christopher Li (2009-10-16). 「Sparse 0.4.2 リリース」. linux-sparse (メーリング リスト) . 2010-11-06に閲覧。
- ^ Sparseのメンテナーを変更、 2018年12月10日取得
- ^ 「属性構文 — GNU コンパイラ コレクション (GCC) の使用」。フリーソフトウェア財団。2010年 11 月 13 日閲覧。
さらに読む
- Neil Brown (2016-06-08). 「Sparse: 内部構造」LWN.net . 2021-11-26閲覧。
- Jonathan Corbet (2004-06-01). 「カーネルの問題を自動的に検出する」. LWN.net . 2021-11-26閲覧。
- Doc Searls (2003-11-24). 「Linus & the Lunatics, Part I」. Linux Journal . 2021-11-26閲覧。
- Subrata Modak、Balbir Singh、Yamato Masatake (2009)。LTP のテスト - Linux カーネルとテストケースの両方の検証(PDF)。オタワ Linux シンポジウム 2009。pp. 209–220 。2021年 11 月 26 日閲覧。
- Daniel De Graaf (2010)。変更セットの静的欠陥の検出(PDF) (修士論文)。エイムズ、アイオワ: アイオワ州立大学。OCLC 665146513。2010年 11 月 7 日閲覧。
