変数がmemalign未満である場合や、キャッシュの状況が発生している場合を除いて、整数を読み取るための読み取りロックが必要ですか?
2 に答える
アナライザーは、のアドレスf1()
が取得されているため、任意のコンテキストからその関数ポインターを介して呼び出すことができると想定しています。たとえば、1つのスレッドを更新している場合x
:
lock xlock;
update x;
unlock xlock;
また、別のスレッドがf1()
関数ポインタを介して同時に呼び出す場合f1()
、その2番目のスレッドへのアクセスはロックによって保護されません。したがって、の部分的な更新が表示されx
たり、他の更新に対して誤った順序で更新が表示されたりする可能性があります。
関数ポインタが重要である理由は、のアドレスがf1()
取得されない場合、アナライザは関数がどこから呼び出されたかを正確に判断できるためです。アドレスが取得されると、最悪の場合を想定する必要があります。
あなたが引用したテキストから(私の強調):
関数のアドレスが取得されている場合、その関数に対して行われたすべての呼び出しのコンテキストがわからないと想定します。
lintは、呼び出しが行われる可能性のあるすべてのコンテキストを判別できるわけではないため、アクセスによってデータ競合がf1
発生するコンテキストを含め、どのコンテキストでも呼び出すことができると想定しています。x
当然のことながら、を返すことで悲惨なことは何も起こらないでしょうx
。しかし、それは確率であり、lintを使用することの全体的なポイントは、予期しない入力でコードがどのように機能するかに関する不確実性を減らすことです。