警告 C26135

関数 'func' に注釈 'annotation' がありません。

注釈

警告 C26135 は、関数が"ロック取得" または "ロック解放" 副作用を持つロック ラッパー関数であるとアナライザーが推測すると発行されます。 コードがラッパー関数であることを意図していない場合は、ロックがリークしているか (取得されている場合)、または正しく解放されていない (ロックが解放されている場合)。

次の例では、適切な副作用注釈が見つからないため、警告 C26135 が生成されます。

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

void MyEnter(DATA* p)
{
    // Warning C26135:
    // Missing side effect annotation _Acquires_lock_(p->cs)
    EnterCriticalSection(&p->cs);
}

void MyLeave(DATA* p)
{
    // warning C26135:
    // Missing side effect annotation _Releases_lock_(p->cs)
    LeaveCriticalSection(&p->cs);
}

条件付きロックの副作用が検出された場合も、警告 C26135 が発行されます。 条件付き効果に注釈を付けるには、_When_(ConditionExpr, LockAnnotation) 注釈を使用します。ここで、LockAnnotation_Acquires_lock_ または _Releases_lock_ で、述語式 ConditionExpr はブール条件式です。 同じ関数に対する他の注釈の副作用は、ConditionExpr が true に評価された場合にのみ発生します。 ConditionExpr は、条件を呼び出し元にリレーするために使用されるため、呼び出し元のコンテキストで認識される変数を含む必要があります。 これには、関数パラメーター、グローバル変数、クラス メンバー変数、または戻り値が含まれます。 戻り値を表示するには、次の例に示すように、注釈に特別なキーワード return を使用します。

 typedef struct _DATA
 {
     CRITICAL_SECTION cs;
     int state;
} DATA;

_When_(return != 0, _Acquires_lock_(p->cs))
int TryEnter(DATA* p)
{
    if (p->state != 0)
    {
        EnterCriticalSection(&p->cs);
        return p->state;
    }

    return 0;
}

共有/排他ロック (リーダー/ライター ロックとも呼ばれる) の場合は、次の注釈を使用して、ロックの副作用を表現できます。

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)