Вывод указателя на ошибку 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