我正在尝试将SAL添加到我的代码中...我根据msdn工作并发现msdn示例中的错误,不知道如何处理它。
这里litle改变了示例“从Understanding SAL输出指向调用者的指针(例如:Outptr注释)”
Outptr用于注释要返回的参数 指针。参数本身不应该是NULL,而是被调用 函数返回一个非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: using uninitialized memory
代表
if (*pInt != NULL)
行。
我的注释中有什么问题,我该如何解决?
答案 0 :(得分:2)
由于您正在读取通过指针参数pInt
传递的值,因此您无法使用_Outptr_
,因为这描述的参数仅用作输出,也不作为输入。请改用_Inout_
。
您可能想重新考虑使用SAL。它记录得非常糟糕,因此我无法确切地说_Inout_
实际上是这里使用的最佳注释。我所知道的是,根据微软的模糊描述,我能找到它最好的匹配,并且它摆脱了警告。当然不会使用注释。
答案 1 :(得分:1)
编辑:我对类似的变量名称pInt
和pInt2
感到困惑。
您可能应该将pInt
标记为输入和输出,而不仅仅是输出,因为您正在读取它的值以检查它是否为NULL