declare |
mutex |
mutex . . . |
|
declare |
rwlocks |
rwlock ... |
|
declare |
func_ptr |
targets |
func ... |
declare |
nonreturning |
func ... |
|
declare |
one |
tag ... |
|
declare |
readable |
var ... |
|
declare |
root |
func ... |
|
これらのサブコマンドは、ロック lint に対して、提示されているソースからは推測できない事柄を伝えます。
これらのサブコマンドは (この後の declare root とともに)、主に、サポートするハーネスなしで、ライブラリを解析する際に使用されます。サブコマンド declare mutex と declare rwlocks は、特定された名前の相互排他ロックおよび読み取り側/書き込み側ロックを生成します。これらの名前は、その後の assert サブコマンドで利用されます。
指定された関数を、指定された関数ポインタを介した呼び出しが可能な関数のリストに追加します。
ロック lint は、初期設定および割り当て構成に注目し、独力で関数ポインタのターゲットについての大量な情報を収集します。たとえば、以下のコードに対して、
struct foo { int (*fp)(); } foo1 = { bar };
ロック lint は、以下のコマンドに相当する動作を実行します。
% lock_lint declare foo::fp targets bar
ロック lint は (上記の例に対して)、以下の動作は行いません。
% lock_lint declare foo1.fp targets bar
しかし、関数ポインタの割り当てに対しては、いずれの動作も行います。「ロックの逆転」を参照してください。
ロック lint に対して、指定された関数は戻らないことを伝えます。ロック lint は、この関数が呼び出された後、ロックの状態についてのエラーを報告しません。
そのタグが指定されている各構造体の名前未定のインスタンスが 1 つだけ存在することを、ロック lint に伝えます。これによって、その構造体のロックが解放されることなく複数回獲得された場合に、ロック lint はエラーを報告します。こうした情報がない場合は、構造体の 2 つの異なるインスタンスが含まれる可能性があるため、ロック lint は、匿名のロック (例えば foo::lock) の複数獲得について不具合を報告することはありません (「ロックの逆転」 を参照)。
ロック lint に対して、ロックを保持しなくても、指定された変数が安全に読み込まれることを伝えます。さらに、こうした非保護状態での読み込みに対して、通常は表示されるエラーも抑制されます。
指定された関数をルート関数として解析するよう、ロック lint に指示します。デフォルトでは、関数がほかの関数から呼び出される場合、ロック lint はその関数を呼び出しシーケンスのルートとして解析しようとはしません。
ルート関数とは、解析の開始ポイントです。読み込まれたファイル内から呼び出されることのない関数は本来ルートです。たとえば、直接呼び出されることはないけれど、スレッドの初期開始ポイントである関数 (thread_create 呼び出しのターゲット関数など) もこれに含まれます。しかし、読み込まれたファイルの内側から呼び出される関数が、読み込まれたファイルの外側から呼び出されることもあり、こうした場合は、このサブコマンドを使って、ロック lint にこの関数を解析の開始ポイントとして使用するよう指示する必要があります。