C26135

警告 C26135: 缺少 <annotation> 注释 在函数 <func>。

警告 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)