2

我正在尝试将SAL添加到我的代码中...我根据 msdn 工作并在 msdn 示例中发现了错误,不知道如何处理它。

这里很少更改来自理解 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;
}

如果我在启用代码 alalysys 的 VS2013 中编译它,我得到C6001: using uninitialized memory

为了

if (*pInt != NULL)

排。

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

4

2 回答 2

2

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

您可能需要重新考虑使用 SAL。它的文档记录很差,因此我不能肯定地说这_Inout_实际上是在这里使用的最佳注释。我所知道的是,根据微软的模糊描述,这是我能找到的最佳匹配,并且它消除了警告。当然不会使用注释。

于 2014-11-01T19:25:27.600 回答
1

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

于 2014-10-31T16:20:52.707 回答