Вывод указателя на ошибку SAL вызывающей стороны

Я пытаюсь добавить SAL в мой код... я работал в соответствии с msdn и нашел ошибку в примерах msdn, не знаю, как с этим бороться.

Здесь немного изменился пример "Вывод указателя на вызывающую сторону (пример: аннотация Outptr)" из Понимания SAL

Outptr используется для аннотирования параметра, который предназначен для возврата указателя. Сам параметр не должен иметь значение NULL, и вызываемая функция возвращает в нем ненулевой указатель, и этот указатель указывает на инициализированные данные.

Мой код:

#include "stdafx.h"
#include "assert.h"

void GoodOutPtrCallee(_Outptr_ int **pInt)
{
    int *pInt2 = new int;

    if (*pInt != NULL)
    {
        *pInt2 = 1;
    }
    else
    {
        *pInt2 = 2;
    }

    *pInt = pInt2;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int* nullValue = NULL;
    GoodOutPtrCallee(&nullValue); 
    assert(*nullValue == 2);

    int someValue = 22;
    int* someValuePtr = &someValue;
    GoodOutPtrCallee(&someValuePtr); 
    assert(*someValuePtr == 1);

    return 0;
}

Если я скомпилирую его в VS2013 с включенным alalysys, я получу C6001: использование неинициализированной памяти

за

if (*pInt != NULL)

строка.

Что здесь, в моей аннотации, и как я могу это исправить?

2 ответа

Поскольку вы читаете из значения, переданного через параметр указателя pInt ты не можешь использовать _Outptr_, так как это описывает параметр, который используется только как выход, а не как вход. использование _Inout_ вместо.

Вы можете пересмотреть использование SAL. Это очень плохо документировано, и в результате я не могу с уверенностью сказать, что _Inout_ на самом деле лучшая аннотация для использования здесь. Все, что я точно знаю, это то, что это лучшее совпадение, которое я смог найти на основе смутных описаний Microsoft, и оно избавляется от предупреждения. Конечно, так не будет использовать аннотации.

РЕДАКТИРОВАТЬ: меня смутили похожие имена переменных, pInt а также pInt2, Вы, вероятно, должны отметить pInt как ввод и вывод, а не только как вывод, потому что вы читаете его значение, чтобы проверить, является ли оно NULL

Другие вопросы по тегам