Я пытаюсь добавить 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)
строка.
Что здесь, в моей аннотации, и как я могу это исправить?
Поскольку вы читаете из значения, переданного через параметр указателя pInt
ты не можешь использовать _Outptr_
, так как это описывает параметр, который используется только как выход, а не как вход. использование _Inout_
вместо.
Возможно, вы захотите пересмотреть использование SAL. Это очень плохо документировано, и в результате я не могу с уверенностью сказать, что _Inout_
на самом деле лучшая аннотация для использования здесь. Все, что я точно знаю, это то, что это лучшее совпадение, которое я смог найти на основе смутных описаний Microsoft, и оно избавляется от предупреждения. Конечно, так не будет использовать аннотации.
РЕДАКТИРОВАТЬ: Меня смутили похожие имена переменных, pInt
а также pInt2
,
Вы, вероятно, должны отметить pInt
как ввод и вывод, а не только как вывод, потому что вы читаете его значение, чтобы проверить, является ли оно NULL