Поделиться через


C26135

предупреждение C26135: Отсутствует заметка <заметка> для функции <функция>.

Предупреждение 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)