Предупреждение C28196

Требование не удовлетворяется. (Выражение не оценивается как true.)

Это предупреждение означает, что анализируемая функция имеет __notnull__null__drv_valueIs или аналогичную заметку для _Out_ параметра или возвращаемого значения, но возвращаемое значение не соответствует этой заметке.

Замечания

Заметки, такие как описание инвариантных _Out_ параметров и возвращаемых значений, которые служат как документацией, так __notnull и в качестве проверка для автора функции. Предупреждение C28196 указывает на несоответствие между заметками и фактическим поведением функции. Предупреждение может быть полезно для обнаружения случаев, когда функция может вести себя неожиданно для определенных входных значений. Затем автору нужно решить, что такое предполагаемое поведение функции, а также адаптировать заметки или реализацию соответствующим образом.

Примеры

Следующая функция вызывает предупреждение C28196, так как оно аннотировано, _Ret_notnull_ даже если некоторые пути кода возвращают указатель null.

#include <sal.h>

_Ret_notnull_
Item *get_item(_In_reads_(len) Item *items, size_t len, size_t index) {
    if (index >= len) {
        return nullptr;
    }

    return items + index;
}

Чтобы устранить эту проблему, устраните заметку, чтобы точно отразить поведение функции.

#include <sal.h>

_When_(index < len, _Ret_notnull_)
Item *get_item(_In_reads_(len) Item *items, size_t len, size_t index) {
    if (index >= len) {
        return nullptr;
    }

    return items + index;
}

См. также

Аннотирование параметров функции и возвращаемых значений
Указание времени и места применения примечания\