输出指向调用者SAL错误的指针

时间:2014-10-31 16:14:39

标签: c++ c pointers sal

我正在尝试将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)

行。

我的注释中有什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:2)

由于您正在读取通过指针参数pInt传递的值,因此您无法使用_Outptr_,因为这描述的参数仅用作输出,也不作为输入。请改用_Inout_

您可能想重新考虑使用SAL。它记录得非常糟糕,因此我无法确切地说_Inout_实际上是这里使用的最佳注释。我所知道的是,根据微软的模糊描述,我能找到它最好的匹配,并且它摆脱了警告。当然不会使用注释。

答案 1 :(得分:1)

编辑:我对类似的变量名称pIntpInt2感到困惑。 您可能应该将pInt标记为输入和输出,而不仅仅是输出,因为您正在读取它的值以检查它是否为NULL