C26135

警告 C26135: 関数 <func> で注釈 <注釈> が見つかりません

警告 C26135 は関数は、ロックをリリース副作用を取得またはロックされているロックのラッパー関数であることをアナライザーが判断した場合に発生します。コードは、ラッパー関数として作成されていない場合、lock (ロックが解放されている場合) または誤って解放されています (漏ってロックを取得した場合、)。

使用例

次の例は、適切な副作用の注釈が指定されていないために、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 は、条件付きのロックの副作用が検出された場合に発生します。条件の効果に注釈を付けるには、LockAnnotation が _Acquires_lock_ です。また、_Releases_lock_ および述語式 ConditionExpr がブール条件式である _When_(ConditionExpr, LockAnnotation) の注釈を使用します。同じ関数には他の注釈の副作用は 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;
    }

(リーダー/ライター ロック Shared と排他ロックでは、次の注釈を使用して副作用をロックすることを指定する:

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)