【发布时间】:2014-10-31 16:14:39
【问题描述】:
我正在尝试将SAL添加到我的代码中...我根据msdn工作并在msdn示例中发现了错误,不知道如何处理。
这里很少更改示例“指向调用者的指针的输出(示例:Outptr 注释)”来自Understanding SAL
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;
}
如果我在启用代码 alalysys 的 VS2013 中编译它,我得到C6001: using uninitialized memory
为
if (*pInt != NULL)
行。
我的注释中出现了什么问题,我该如何解决?
【问题讨论】:
-
如果您希望这样的错误代码通过分析,那么您必须删除 SAL 注释。这当然不是你的本意。
-
@HansPassant 是用于查找 SAL 工作原理的演示代码......并不理想......但是这种方法有什么不好?
-
SAL 没有很好的文档记录。我找到了与我的函数原型匹配的 VC++ 标头,并查看它是如何注释的。截至目前,我无法收集此类功能(
int**)。 -
我只想说编译器告诉我们
pInt指向的内容正在被读取,尽管pInt被注释为“仅”返回某些内容,这意味着它只是被写入。