ロックおよびその使用法の解析において、ロック lint は一般的なデータ競合 (変数にアクセスする際に、適切なロックを獲得できないなど) の原因を検出します。
表 5-1、 表 5-2 および 表 5-3 に、ロック lint が認識する Solaris および POSIX libthread API の ルーチンの一覧を示します。
表 5-1 排他ロック
Solaris |
POSIX |
Kernel (Solaris のみ) |
---|---|---|
mutex_lock mutex_unlock mutex_trylock |
pthread_mutex_lock pthread_mutex_unlock pthread_mutex_trylock |
mutex_enter mutex_exit mutex_tryenter |
表 5-2 読み取り書き込みロック
Solaris |
Kernel (Solaris のみ) |
---|---|
rw_rdlock, rw_wrlock rw_unlock rw_tryrdlock, rw_trywrlock
|
rw_enter rw_exit rw_tryenter rw_downgrade rw_tryupgrade |
表 5-3 条件変数
Solaris |
POSIX |
Kernel (Solaris のみ) |
---|---|---|
cond_broadcast cond_wait
cond_timedwait
cond_signal |
pthread_cond_broadcast pthread_cond_wait
pthread_cond_timedwait
pthread_cond_signal |
cv_broadcast cv_wait cv_wait_sig cv_wait_sig_swap cv_timedwait cv_timedwait_sig cv_signal |
さらに、ロック lint は表 5-4 に示す型も認識します。
表 5-4 ロック構造
Solaris |
POSIX |
Kernel (Solaris のみ) |
---|---|---|
mutex_t rwlock_t |
pthread_mutex_t
|
kmutex_t krwlock_t |
ロック lint は、解析対象であるモジュールに関するいくつかの基本情報の報告を行います。
関数のロッキング副作用。未知の副作用がデータ競合やデッドロックにつながることがあります。
(少なくとも 1 つのロックによって) 整合性のある保護がなされていない変数へのアクセス。および、どのロックが変数を保護するかに関するアサーションに違反するアクセス。この情報は潜在的なデータ競合を指摘します。
サイクルおよび整合性のないロックの取得順序。この情報は潜在的なデッドロックを指摘します。
特定のロックによって保護されている変数。この情報は選択されている細分性 (どの変数がどのロックによって保護されているか) が適切かどうかを判断する手助けとなります。
ロック lint はアプリケーションについてのアサーションを指定するためのサブコマンドを提供します。解析段階において、ロック lint はアサーションの違反を報告します。
プログラムを拡張する際には、新しいアサーションを追加し、解析フェーズを 実行してそのアサーションに改善を加え、その結果確立された プログラムのロック規則を新しいコードが違反しないように留意すべきです。