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 警告发出还条件锁定的副作用。若要批注 case 的效果,请使用 _When_(ConditionExpr, LockAnnotation) 批注,或者 _Acquires_lock_ 或 LockAnnotation 是 _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)